Mockito何时()不工作

时间:2015-09-24 09:16:06

标签: java spring spring-boot mockito

我已经使用Mockito创建了一个测试用例。我想测试一个控制器。当控制器被调用时,我想发回一个响应对象而不想让控制器里面的代码执行。但即使我用过的时候( functionName).thenReturn(),它进入控制器代码。我在这里做错了什么?

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class MockitoController {

@Autowired
private WebApplicationContext webApplicationContext;

protected MockMvc mockMvc;

@SuppressWarnings("unchecked")
@Before
public void setup() {

    MyController myController = Mockito.mock(myController.class);

    ResponseView jsonResponse = new ResponseView();
    jsonResponse.setStatus(1);
    jsonResponse.setMessage("true");

    Mockito.when((myController.deleteMedia(Mockito.anyInt()))).thenReturn(jsonResponse);

    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();

}

@Test
public void deleteMediaMockito() throws Exception {

    RequestBuilder requestBuilder = MockMvcRequestBuilders.delete("/library/99")
            .accept(MediaType.APPLICATION_JSON);

    MvcResult result = this.mockMvc.perform(requestBuilder).andReturn();
    JSONObject jsonObject = new JSONObject(result.getResponse().getContentAsString());

    assertEquals(1, jsonObject.get("status"));
}
}

2 个答案:

答案 0 :(得分:2)

我会尝试一个包含模拟控制器的本地类。你的测试类里面有这样的东西。这将注册您的模拟并覆盖应用程序上下文中的真实MyController。

@Configuration
    public static class MyMockConfig {

        @Bean
        @Primary
        MyController myController() {
            Mockito.mock(MyController.class);
        }
    }

但我不相信你测试的东西是有道理的。 MockMvc用于测试整个控制器,包括requestMappings等。

那你为什么要嘲笑它的一部分呢?控制器是您的待测单元。试着去除它的依赖关系。

但是仍然 - 我发布的代码可以帮助将模拟注入spring bean。

答案 1 :(得分:0)

尝试在此处更改常量的Mockito.anyInt()方法:

Mockito.when((myController.deleteMedia(Mockito.anyInt()))).thenReturn(jsonResponse);

此方法应用于匹配目的,而不是提供值。我遇到了类似于你的情况,测试/时间表现得非常奇怪,只有在我将它们替换为常量之后才开始做我期望的事情。

我希望它有所帮助!