为什么 mockMVC 和 mockito 不能一起工作?
Why mockMVC and mockito don't work together?
我有 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());
}
}
然后在我的测试中 class 我用
注释了 class
@ContextConfiguration(classes = {TestContext.class})
在测试的设置中值得一提class我需要重置 mockedClass 以防止泄漏:
@Before
public void setup() throws Exception {
Mockito.reset(adminDaoMock);
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
与其创建单独的 TestContext class,不如使用 @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)))
;
}
我有 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());
}
}
然后在我的测试中 class 我用
注释了 class@ContextConfiguration(classes = {TestContext.class})
在测试的设置中值得一提class我需要重置 mockedClass 以防止泄漏:
@Before
public void setup() throws Exception {
Mockito.reset(adminDaoMock);
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
与其创建单独的 TestContext class,不如使用 @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)))
;
}