()不工作时Mockito



我已经使用Mockito创建了一个测试用例。我想测试一个控制器。当控制器被调用时,我想发送回一个响应对象,不希望控制器内的代码执行。但即使我已经使用when(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"));
}
}

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

@Configuration
    public static class MyMockConfig {
        @Bean
        @Primary
        MyController myController() {
            Mockito.mock(MyController.class);
        }
    }

但是我不相信你正在测试的东西是有意义的。MockMvc是用来测试你的控制器作为一个整体,包括requestMappings等。

那你为什么要嘲笑它的一部分呢?控制器是你正在测试的设备。试着模拟掉它的依赖。

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

尝试在这里为常量更改Mockito.anyInt()方法:

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

此方法应用于匹配目的,而不是提供值。我有一个类似于你的情况,测试/时的行为真的很奇怪,并开始做我所期望的只有在我替换它们为常量后。

我希望它有帮助!

相关内容

  • 没有找到相关文章

最新更新