【问题标题】:MockMvc remains null [closed]MockMvc 保持为空 [关闭]
【发布时间】:2019-12-25 08:16:55
【问题描述】:

我想进行集成测试。我目前的做法:

@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,但MockMvc对象仍然为空

【问题讨论】:

  • 能否添加运行测试时得到的错误信息?
  • @Sebastian NPE 刚刚被抛出
  • 我认为可能有更多关于正在初始化的 Spring 上下文的信息。

标签: spring-boot integration-testing junit5


【解决方案1】:

我真的不明白这种测试的目的是什么,让我解释一下......

通常使用 MockMvc 来测试应用的 web 层。

这意味着在引擎盖下 spring 运行“某些东西”,可以模拟发送到控制器的请求,以便您可以检查注释是否正确放置,对象的转换是否以正确的方式完成等等。换句话说就像测试控制器一样,但它与服务、DAO 等无关。通常,控制器对服务的引用可以用 @MockBean 注释,这样 spring 将为服务创建一个存根,你就可以描述相互作用。无论如何都不应从控制器中引用 DAO 之类的其他东西(不是吗?;)),但总的来说,模拟这些依赖项的相同模式在这里适用。

技术上它的完成如下: web mvc 测试(如果注释正确)不会加载整个应用程序上下文,而是加载它的“切片” - 仅与 web 层相关的 bean。

现在@SpringBootTest 注释做了一些不同的事情。它专为 Spring Boot 应用程序设计,并允许模拟整个 Spring 应用程序负载。在我的脑海中(也许其他同事会丰富这个列表),它“加起来”到常规应用程序上下文开始:

  • 属性配置管理
  • 启动器(自动配置模块)
  • 针对 Bean 和配置的包结构特定扫描

归根结底,它允许从某些特定配置或整个应用程序中启动 Spring Boot Test,它仅与 Web 层无关

所以,我不明白这里究竟要测试什么。 如果您的目标是测试 Web 层,那么您不必使用 Spring Boot 注解(除了我已经解释过的,Spring Boot 测试需要更多时间来加载)

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

【讨论】:

  • 这是一个整体。目标是通过所有层测试 REST enpoints 方法
  • 如果你想测试流程,不要使用MockMvc...同样,MockMvc 仅用于测试RestControllers,但它根本不加载服务层。
  • 不确定,应该用什么代替?
  • 仅 SpringBootTest... 它将运行整个应用程序(无论是单体应用程序还是微服务)。 MockMvc = 可以访问控制器但不能访问业务逻辑层的模拟服务器。 SpringBootTest = 整个应用程序。您可以将控制器注入测试 (Autowire) 并像普通 Java 类一样调用它们。或者你甚至可以启动整个网络服务器并通过真正的 http 或其他方式进行调用。
【解决方案2】:

如果您使用 @RunWith(SpringRunner.class) 注释您的测试,您的 mockMvc 将不会为空。

【讨论】:

  • 好吧,我不使用 jUnit4
  • 切换到@RunWith时实际上是failedToLoadApplicationContext
  • 在 Junit 5 上,您确实需要使用 @ExtendWith,这不是问题 :)
  • 另外,在我的电脑上,我尝试删除 @TestPropertySource(locations = "classpath: application-test.yml") 和 (classes = Application.class) 并且我的 mockMvc 不为空。(我有删除这 2 件事,因为您没有显示这 2 件事)。也许问题出在哪里。
  • 是的,但它只适用于 @RunWith *junit4,不适用于 junit5 @ExtendWith 出于某种原因
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多