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

对不同的测试方法使用不同的Spring测试上下文配置

鲜于星波
2023-03-14

我们有一个基于Spring的JUnit测试类,它利用一个内部测试上下文配置类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ServiceTest.Config.class)
public class ServiceTest {

    @Test
    public void someTest() {
    ...

    @Configuration
    @PropertySource(value = { "classpath:application.properties" })
    @ComponentScan({ "..." })
    public static class Config {
    ...

最近,服务类中引入了新的功能,相关测试应添加到ServiceTest中。但是,这也需要创建不同的测试上下文配置类(现有配置类的内部结构相当复杂,如果可能的话,将其更改为既服务于旧测试又服务于新测试似乎非常困难)

有没有一种方法可以实现一个测试类中的某些测试方法将使用一个配置类,而其他方法将使用另一个?@ContextConfiguration似乎只适用于类级别,因此解决方案可能是为新测试创建另一个测试类,该测试类将利用其自己的上下文配置类;但这将意味着相同的服务类通过两个不同的测试类

共有2个答案

方宜
2023-03-14

当我必须解决这个问题时,我会使用这些方法:

  • 在设置方法中手动构建上下文,而不是使用注释
  • 将公共测试代码移动到基类并扩展它。这使我能够在不同的spring上下文中运行测试
  • 以上两者的混合。然后,基类包含从片段(扩展可以覆盖)构建spring上下文的方法。这也允许我覆盖没有意义的测试用例,或者在一些测试中做额外的前/后工作

请记住,注释只解决一般情况。离开共同点后,你必须复制他们的部分或全部工作。

马坚
2023-03-14

Aaron建议手动构建上下文,我找不到任何好的例子,所以在花了一些时间让它工作后,我想我应该发布一个简单版本的代码,以防它帮助其他人:

class MyTest {

    @Autowired
    private SomeService service;
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    public void init(Class<?> testClass) throws Exception {
        TestContextManager testContextManager = new TestContextManager(testClass);
        testContextManager.prepareTestInstance(this);
    }

    @After
    public void tearDown() throws Exception {
        applicationContext.close();
    }

    @Test
    public void test1() throws Exception {
        init(ConfigATest.class);
        service.doSomething();
        // assert something
    }

    @Test
    public void test2() throws Exception {
        init(ConfigBTest.class);
        service.doSomething();
        // assert something
    }

    @ContextConfiguration(classes = {
        ConfigATest.ConfigA.class
    })
    static class ConfigATest {
        static class ConfigA {
            @Bean
            public SomeService someService() {
                return new SomeService(new A());
            }
        }
    }

    @ContextConfiguration(classes = {
        ConfigBTest.ConfigB.class
    })
    static class ConfigBTest {
        static class ConfigB {
            @Bean
            public SomeService someService() {
                return new SomeService(new B());
            }
        }

    }
}
 类似资料:
  • 我正在与: Spring Framework JUnit 分级 我有这两个测试类 null Spring Boot/JUnit,为多个配置文件运行所有单元测试 但是我希望避免通过或使用命令,它通过类保持控件。

  • db-config-test.xml Maven插件: StackError:

  • 我有一个通用代码库,需要用不同的实现和运行时配置进行测试。考虑使用多个DAO实现的服务。我有测试Dao接口的通用单元测试(需要Dao自动连接),我想从不同的项目中调用这些测试。 基本上我想要这样的东西。在共享的通用项目中,我的测试将有效。所以本质上,在共享项目中,我有我的测试,例如。 然后在实现Dao的其他项目中,我会: . 同样,有多个项目以不同的方式实现DAO层,我想分享通用测试。 如果我能将

  • 是否支持不同的测试配置文件?在我的本地测试期间,我想使用“mvn包”,它使用“测试”配置文件。这指向我的本地主机数据库。对于我的 DevOps 工具链,我想使用不同的测试配置文件,因为我们使用的是容器,不能使用本地主机。目标是区分本地计算机测试和云环境。测试。

  • 我有一个依赖Spring批处理JobLauncher的类。 我想使用这个JobLauncher的异步版本,所以我创建了一个配置: 我不得不使用,否则当应用程序运行时,其他一些同步JobLauncher会被选中。 现在,在我的测试中,我想使用同步版本来验证作业执行的结果。因此,我在配置中定义了同步bean: 然而,当我的测试运行时。。它总是使用异步版本,我的结果不正确。 是否有一种方法可以在我的测试

  • 嗨,我有一个Spring Boot(2.1.6发行版)应用程序,我正在尝试添加一些简单的集成测试到我的应用程序。首先,我创建了一个基础IntegrationTest类,如下所示: 这是我的测试方法: 有什么建议吗?