如何使用jmockit和spring的mockmvc来测试控制器
作者:互联网
我想用mockmvc来测试Spring推荐的控制器.但是,我还必须使用jmockit来模拟依赖性.
问题是jmockit无法与mockmvc一起使用,无论是standaloneSetup()还是webAppContextSetup().
另一个名为Mockito的模拟工具已经完成了这个问题,但它在模拟依赖项方面有很多限制.
所以,任何人都有经验或想法,请告诉我.非常感谢你.
示例代码如下:
第一个是Mockito和Spring的MockMvc到单元测试控制器.运行良好.
public class TestControllerTest {
@InjectMocks
private LoginController loginController;
@Mock
private LoginService loginService;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
}
@Test
public void testLogin() throws Exception {
when(loginService.login()).thenReturn(false);
this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}
其次,jmockit如下.不幸的是,loginController在setup方法中为null.而且,如果我只是在@Tested方法中调用loginController.xxx()就可以了.我认为这表明loginController在@Tested方法之前但在@Before方法之后被实例化.
public class TestControllerTest2 {
@Tested
private LoginController loginController;
@Injectable
private LoginService loginService;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
}
@Test
public void testLogin() throws Exception {
new Expectations() {{
loginService.login(); result = false;
}};
this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}
那么,这个问题怎么解决呢? jmockit的少数init方法?有可能吗?
解决方法:
与Mockito的@InjectMocks不同,JMockit的@Tested字段只有在执行任何@Before方法后才会创建.这是因为测试方法中对模拟参数的支持,这在Mockito中不存在.可以说,测试字段应该与模拟字段一起提前设置,因此这可能会在未来版本的JMockit中发生变化.
无论如何,现在问题的解决方案是:
>不要使用@Tested;相反,在@Before方法中手动实例化并注入被测对象.
>使用@Tested,但要避免依赖于测试字段的@Before方法.在示例测试中,可以通过调用MockMvc mockMvc(){return MockMvcBuilders …}方法在每个测试方法中创建MockMvc对象.
标签:unit-testing,spring,jmockit 来源: https://codeday.me/bug/20190830/1766488.html