Spring boot MockMvc保持为空

Spring boot MockMvc保持为空,spring-boot,integration-testing,junit5,Spring Boot,Integration Testing,Junit5,我想做一个集成测试。我目前的做法是: @ExtendWith(SpringExtension.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class) @AutoConfigureMockMvc @TestPropertySource(locations = "classpath: application-test.yml") pu

我想做一个集成测试。我目前的做法是:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class)
@AutoConfigureMockMvc
@TestPropertySource(locations = "classpath: application-test.yml")
public class UserControllerIntegrationTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    @DisplayName(" sda")
    public void test1(){

        System.out.println();
    }

}

我放置了@AutoConfigureMockMvc,但是如果您使用@RunWithSpringRunner.class注释您的测试,MockMvc对象将保持为null。您的MockMvc将不会为null。

我无法真正理解这样一个测试的目的,让我解释一下

通常,MockMvc用于测试应用程序的web层

这意味着,在引擎盖下,spring运行一些可以模拟发送给控制器的请求的东西,以便您可以检查注释是否正确放置,对象的转换是否以正确的方式完成,等等。换句话说,它类似于测试控制器,但与服务、DAO无关,通常,控制器对服务的引用可以用@MockBean注释,这样spring将为服务创建一个存根,并且您将能够描述交互。像DAO这样的其他东西无论如何都不应该从控制器引用,不是吗;但一般来说,模拟这些依赖关系的相同模式在这里也适用

从技术上讲,其工作如下: 正确注释后的web mvc测试不会加载整个应用程序上下文,而是加载其中的一部分—只加载与web层相关的bean

现在@SpringBootTest注释做了一些不同的事情。它专门为spring启动应用程序设计,允许模拟整个spring应用程序负载。在我的脑海中,也许其他同事会丰富这个列表,它将添加到常规应用程序上下文中,开始:

属性配置管理 启动器自动配置模块 针对bean和配置的包结构特定扫描 总之,它允许在某些特定配置或整个应用程序之外启动Spring引导测试,它与web层无关

所以,我不明白的是,这里到底需要测试什么。 如果您的目标是测试一个web层,那么您不必使用SpringBoot注释。除了我已经解释过的以外,SpringBoot测试需要花费更多的时间来加载


如果您的目标是测试整个微服务,或者有时测试微服务的某个特定部分,那么您可以使用@SpringBootTest`注释。

您可以添加运行测试时收到的错误消息吗?@Sebastian NPE只是Thrown我想可能有一些关于正在初始化的Spring上下文的更多信息。嗯,我不使用JUnit4,当切换到Junit 5上的@RunWithOn时,实际上失败的应用程序上下文您确实需要使用@ExtendWith,这不是问题:另外,在我的电脑上,我试图删除@TestPropertySourcelocations=classpath:application-test.yml和classes=application.class,我的mockMvc不是空的。我必须删除这两个东西,因为你没有显示这两个东西。也许问题就在这里。是的,但它只适用于@RunWith*junit4,而不适用于junit5@extendedwith。出于某种原因,它可能有助于它成为一个整体。目标是通过所有层测试REST enpoints方法如果要测试流,请不要使用MockMvc。。。同样,MockMvc只用于测试RESTController,但它根本不加载服务层。不确定应该使用什么来代替?只有SpringBootTest。。。它将运行整个应用程序,无论是一个整体还是微服务。MockMvc=Mock服务器,可以访问控制器,但不能访问业务逻辑层。SpringBootTest=整个应用程序。您可以将控制器注入测试Autowire并调用它们,就好像它们是常规java类一样。或者,您甚至可以启动整个web服务器,并通过真正的http或其他方式进行调用。