为什么 mockMVC 和 mockito 不能一起工作?



我有restful服务,我想在不连接数据库的情况下对它们进行单元测试,因此我编写了以下代码:

@Before
public void setup() throws Exception {
    this.mockMvc = webAppContextSetup(webApplicationContext).build();
    adminDao = mock(AdminDaoImpl.class);
    adminService = new AdminServiceImpl(adminDao);
}
@Test
public void getUserList_test() throws Exception {
    User user = getTestUser();
    List<User> expected = spy(Lists.newArrayList(user));
    when(adminDao.selectUserList()).thenReturn(expected);

    mockMvc.perform(get("/admin/user"))
        .andExpect(status().isOk())
        .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
        .andExpect(jsonPath("$", hasSize(1)))
        ;           
}

服务被呼叫,但我的问题是这行代码

when(adminDao.selectUserList()).thenReturn(expected);

不起作用,我的意思是它真的调用了adminDao.select方法,因此从数据库中获取结果。这是我不想要的。你知道我该如何模拟这个方法调用吗?

感谢@M。Deinum,我解决了我的问题,我添加了一个TestContext配置文件:

@Configuration
public class TestContext {
@Bean
public AdminDaoImpl adminDao() {
    return Mockito.mock(AdminDaoImpl.class);
}
@Bean
public AdminServiceImpl adminService() {
    return new AdminServiceImpl(adminDao());
}       
}

然后在我的测试课上,我用注释了这个类

@ContextConfiguration(classes = {TestContext.class})

值得一提的是,在测试类的设置中,我需要重置mockedClass以防止泄漏:

@Before
public void setup() throws Exception {
    Mockito.reset(adminDaoMock);
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

与其创建单独的TestContext类,不如使用@MockBean注释。

 @MockBean
 AdminDao adminDao;

然后根据您的需要使用它。

 @Test
public void getUserList_test() throws Exception {
   User user = getTestUser();
   List<User> expected = spy(Lists.newArrayList(user));
   when(adminDao.selectUserList()).thenReturn(expected);

   mockMvc.perform(get("/admin/user"))
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
    .andExpect(jsonPath("$", hasSize(1)))
    ;           
}

相关内容

  • 没有找到相关文章

最新更新