我正在開發一個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代碼正在創建一個單獨的線程),但是我無法在不更改非測試代碼的情況下解決此問題。
有沒有人碰到這之前或有什麼建議?提前致謝。
謝謝馬克。我已經檢查過斷點,它看起來像在同一個線程上運行。我還確認路徑變量(userName)正在正確填充。我的數據存儲設置是基本的,所以我不認爲我正在做任何有關HRD的事情。不過,我也注意到,在運行本地GAE dev服務器時,我遇到了類似的問題。我有一個「白手起家」,然後出現在_ah /管理員,但不能用的getUser控制器方法 – Mudged 2013-05-08 06:47:28
嗯:)那麼我想它看起來相當不尋常的被訪問的數據的網址 - 就像你userService和/或的getUser方法需要一點調查。如果你有任何更多的信息隨時添加到qn。我試圖幫助:) – 2013-05-08 13:04:31
我必須在這裏承認編碼錯誤。我的用戶名有'。'在價值。 Spring在{userName}值的末尾剝離了這個值(因爲它假定有一個擴展名),所以儘管我獲得了一個值,但它並不是原始值。我已經通過將映射的URL更改爲'\ users \ users \ {userName} \ details'來解決這個問題。我會粉筆寫這個經驗。 – Mudged 2013-05-09 19:54:20