0

我正在使用 Spring MVC (3.2.2) 和 GAE (1.7.7) 开发应用程序,但 LocalDatastoreServiceTestConfig 和我的 JUnit 测试存在一些问题。使用时,我有许多服务层单元测试工作正常...

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("/users/user/"+user.getId()).accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk())
    .andExpect(content().contentType("application/json"));
}

不幸的是,这似乎不起作用,因为控制器(getUser)方法中的代码没有找到在调用之前创建和检索的用户。

经过一番搜索后,我发现了一些关于本地 GAE 数据源和多线程问题的帖子。问题是来自本地数据源的数据在其他线程上不可用。这是通过在您正在使用的所有线程上调用 APIProxy.setEnvironmentForCurrentThread 来修复的。我怀疑这是我在这里面临的问题(即 mockmvc 代码正在创建一个单独的线程)但是我无法在不更改非测试代码的情况下解决这个问题。

有没有人遇到过这个或有任何建议?提前致谢。

4

1 回答 1

0

我很确定当我过去做过类似的测试时,不会有另一个线程在起作用。但是,您可以轻松地在控制器中设置断点并从调用堆栈中确认。

我建议这样做并检查它以及 userService 和 userName 是否符合您的预期。

我过去注意到的一件事是 mockMvc 需要 @Pathvariable 名称集。

@Pathvariable("userName") String userName

要检查的另一件事是,您没有通过某些应用百分比来模拟 HRD。但是,您发布的代码似乎并非如此,您可以在测试中检索用户。

于 2013-05-07T22:07:18.590 回答