Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito()不工作时_Java_Spring_Spring Boot_Mockito - Fatal编程技术网

Java Mockito()不工作时

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

我使用Mockito创建了一个测试用例。我想测试一个控制器。当调用控制器时,我想发回一个Response对象,不想让控制器内的代码执行。但是,即使我使用了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等

那你为什么要嘲笑它的一部分呢。控制器是您正在测试的单元。试着模仿它的依赖关系


但是,我发布的代码仍然可以帮助将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实例。所以在运行时,您的模拟永远不会被触动。