当前位置: 首页 > 知识库问答 >
问题:

Spring-boot测试-多个测试可以共享单个上下文吗?

刘升
2023-03-14

我创建了多个spring-boot测试类(使用spring-boot1.4.0)。

FirstActionTest。java:

@RunWith(SpringRunner.class)
@WebMvcTest(FirstAction.class)
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

第二个动作测试。java:

@RunWith(SpringRunner.class)
@WebMvcTest(SecondAction.class)
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

运行测试时通过:

运行测试

它似乎为每个测试类创建了一个Spring测试上下文,我想这不是必需的。

问题是:

  • 可以在多个测试类之间共享单个spring测试上下文吗?如果可以,如何共享

共有1个答案

司徒锐进
2023-03-14

通过将两个不同的类与WebMvcTest一起使用(即WebMvcTest(FirstAction.class)和WebMvcTest(SecondAction.class)),您明确表示需要不同的应用程序上下文。在这种情况下,您不能共享单个上下文,因为每个上下文包含一组不同的bean。如果您的控制器bean表现相当好,那么上下文的创建应该相对较快,并且您不应该真的有问题。

如果您真的想拥有一个可以在所有web测试中缓存和共享的上下文,那么您需要确保它包含完全相同的bean定义。脑海中浮现出两种选择:

1)使用@WebMvcTest而不指定任何控制器。

第一个动作测试:

@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

第二个动作测试:

@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

2) 根本不要使用WebMvcTest,这样你就会得到一个包含所有bean的应用程序上下文(不仅仅是web关注点)

第一个动作测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc

    // ...
}

第二个动作测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc

    // ...
}

请记住,缓存的上下文可以使运行多个测试更快,但如果您在开发时重复运行单个测试,那么您将付出创建大量bean的成本,这些bean随后立即被丢弃。

 类似资料:
  • 我有一个Spring Boot项目,其中定义了几个apiendpoint。我目前正在为每个API编写集成测试。我的测试类注释如下。 现在,对于我的每个测试类,都会设置一个新的上下文来执行它们,这需要时间。我更喜欢将每个apiendpoint的测试用例保存在单独的类中,以便在逻辑上组织它们,但我不希望每次添加新的控制器类和相应的测试类时,我的测试执行时间都会猛增。我在这里做错了什么?

  • 我使用Spock框架来运行我的测试。每个测试类上都有Spring的注释。正如我所看到的,每个测试类都需要上下文,在不同的类中运行几十个测试需要很多时间。是否有一种方法可以配置Spock测试类以在公共spring上下文下运行?

  • 我想用Mock测试方法,没有spring上下文。我该怎么做?现在,变量返回null。我想设置方法的返回值。

  • 我在Project中有两个测试文件。一种是直接测试我的持久性层: 另一个是使用持久层测试服务: 我显然推断出测试的执行顺序很重要。 以下是我的3个问题,真正的问题是最后一个: 首先,为什么即使我的类被正确地注释了(所以应该被检测为bean),我也必须将该组件进行扫描注释? 测试顺序有什么关系? 如何使多个JPA测试文件独立运行,并使用正确的依赖项注入?

  • 考虑以下示例: 我正在使用注释的属性为这个测试套件中的所有测试设置属性的值。现在,我想为其中一个测试(例如)设置该属性的另一个值,而不影响其他测试。我怎样才能做到这一点?我已经阅读了Spring Boot docs中的“测试”一章,但是我还没有找到任何与我的用例匹配的东西。

  • 那么,有人有一个如何在spring Camel中使用多上下文测试的示例吗? Spring试验 我的文件