我使用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"));
}
}
最佳答案
我会尝试包含您的模拟控制器的本地类。在测试类中这样的事情。这将注册您的模拟并覆盖应用程序上下文中的实际MyController。
@Configuration
public static class MyMockConfig {
@Bean
@Primary
MyController myController() {
Mockito.mock(MyController.class);
}
}
但是我不相信您要测试的东西是有道理的。 MockMvc用于整体测试您的控制器,包括requestMappings等。
那么,为什么要嘲笑它的一部分。控制器是您的被测设备。尝试嘲笑其依赖性。
但仍然-我发布的代码可以帮助将模拟注入Spring bean。