0

我正在開發一個Spring MVC(3.2.2)和GAE(1.7.7)的應用程序,我在LocalDatastoreServiceTestConfig和我的JUnit測試中遇到了一些問題。我在使用時的服務層單元測試的數量工作確定...GAE LocalDatastoreServiceTestConfig和Spring MVC單元測試

private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); 

@Before 
public void setUp() throws Exception 
{ 
    helper.setUp(); 
} 

public void tearDown() throws Exception 
{ 
    helper.tearDown(); 
} 

我然後創建了一些測試,旨在測試Spring MVC控制器,如下面...

@Controller 
@RequestMapping("/users") 
public class UserController 
{ 
@Autowired 
private UserService userService; 

@RequestMapping(value="/user/{userName}",method=RequestMethod.GET, produces="application/json") 
public @ResponseBody User getUser(@PathVariable String userName) 
{ 
    return this.userService.getUser(userName); 
} 
} 

我的測試看起來如下...

@Test 
public void testGetUser() throws Exception 
{ 
    User user = new User(); 
    //create user object and save to db... 

    //check that it's been created 
    user = this.userService.getUser(userIdOne); 
    assertNotNull(user);  
    ///other asserts... 

    this.mockMvc.perform(get("https://stackoverflow.com/users/user/"+user.getId()).accept(MediaType.APPLICATION_JSON)) 
    .andExpect(status().isOk()) 
    .andExpect(content().contentType("application/json")); 
} 

不幸的是這似乎並不在控制器(的getUser)方法的代碼工作沒有發現這是創建和檢索之前用戶呼叫。

經過一番研究,我找到了一些關於本地GAE數據源和多線程問題的文章。問題是來自本地數據源的數據在其他線程上不可用。這是通過在您使用的所有線程上調用APIProxy.setEnvironmentForCurrentThread來解決的。我懷疑這是我在這裏面臨的問題(即mockmvc代碼正在創建一個單獨的線程),但是我無法在不更改非測試代碼的情況下解決此問題。

有沒有人碰到這之前或有什麼建議?提前致謝。

回答

0

我敢肯定,當我已經在過去是不會有在玩另一個線程中完成類似的測試。不過,您可以在控制器中輕鬆設置斷點並從調用堆棧中確認。

我會建議這樣做,並檢查,並確保userService和userName是你所期望的。

我在過去注意到的一件事是,mockMvc期望@Pathvariable名稱集。

@Pathvariable("userName") String userName 

另一件要檢查的事情是,你沒有通過某些應用百分比模擬HRD。但是,您發佈的代碼似乎並不是這種情況,您可以在測試中檢索用戶。

+0

謝謝馬克。我已經檢查過斷點,它看起來像在同一個線程上運行。我還確認路徑變量(userName)正在正確填充。我的數據存儲設置是基本的,所以我不認爲我正在做任何有關HRD的事情。不過,我也注意到,在運行本地GAE dev服務器時,我遇到了類似的問題。我有一個「白手起家」,然後出現在_ah /管理員,但不能用的getUser控制器方法 – Mudged 2013-05-08 06:47:28

+0

嗯:)那麼我想它看起來相當不尋常的被訪問的數據的網址 - 就像你userService和/或的getUser方法需要一點調查。如果你有任何更多的信息隨時添加到qn。我試圖幫助:) – 2013-05-08 13:04:31

+0

我必須在這裏承認編碼錯誤。我的用戶名有'。'在價值。 Spring在{userName}值的末尾剝離了這個值(因爲它假定有一個擴展名),所以儘管我獲得了一個值,但它並不是原始值。我已經通過將映射的URL更改爲'\ users \ users \ {userName} \ details'來解決這個問題。我會粉筆寫這個經驗。 – Mudged 2013-05-09 19:54:20