Java Mockito()不工作时
我使用Mockito创建了一个测试用例。我想测试一个控制器。当调用控制器时,我想发回一个Response对象,不想让控制器内的代码执行。但是,即使我使用了When(functionName)。thenReturn(),它也会进入控制器代码。我在这里做错了什么Java Mockito()不工作时,java,spring,spring-boot,mockito,Java,Spring,Spring Boot,Mockito,我使用Mockito创建了一个测试用例。我想测试一个控制器。当调用控制器时,我想发回一个Response对象,不想让控制器内的代码执行。但是,即使我使用了When(functionName)。thenReturn(),它也会进入控制器代码。我在这里做错了什么 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguratio
@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等
那你为什么要嘲笑它的一部分呢。控制器是您正在测试的单元。试着模仿它的依赖关系
但是,我发布的代码仍然可以帮助将mock注入到Springbean中 在此处尝试更改常量的Mockito.anyInt()方法:
Mockito.when((myController.deleteMedia(Mockito.anyInt()))).thenReturn(jsonResponse);
此方法应用于匹配目的,而不是提供值。我的情况与你的情况类似,测试/测试行为非常奇怪,只有在我将它们替换为常量后,我才开始做我期望的事情
我希望有帮助 要么我是盲人,要么你只是在创建myController,以便在“when”中使用它。被测试的类应该在什么时候使用它不知道的Mock?是的,如何以及在哪里注入
myController
Mock?因为除了您的设置方法之外,它不在任何地方使用。也许您打算将它与您的mockMvc
类一起使用,在这种情况下,您必须将它的控制器设置为您的mock.Mockito.when((myController.deleteMedia(Mockito.anyInt())))。然后返回(jsonResponse);我在这里注入了myController,它包含了处理删除的方法“deleteMedia”API@VallabhLakade不,这是您设置模拟控制器以返回正确响应的地方。由于无论是RequestBuilder
还是mockMvc
都不知道它(您在其中任何一个中都没有设置)在执行代码时不会使用mock。我使用了mockMvc=MockMvcBuilders.standaloneSetup(mediaLibraryController.build();但我不知道为什么它不能与webAppContextSetup一起使用。我搜索了standaloneSetup的描述,但不了解它standaloneSetup不使用完整的应用程序上下文,您可以显式地传递控制器实例。webAppContextSetup使用应用程序上下文,并从应用程序上下文而不是模拟中获取MyController实例。所以在运行时,您的模拟永远不会被触动。