其他分享
首页 > 其他分享> > 如何使用jmockit和spring的mockmvc来测试控制器

如何使用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