我有一个由几个测试组成的BaseTest类。每个测试都应针对我列出的每个配置文件执行。
我考虑过使用参数化值,例如:
@RunWith(Parameterized.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) // @ActiveProfiles("h2-test") // <-- how to iterate over this? public abstract class BaseTest { @Autowired private TestRepository test; // to be used with Parameterized/Spring private TestContextManager testContextManager; public BaseTest(String profile) { System.setProperty("spring.profiles.active", profile); // TODO what now? } @Parameterized.Parameters public static Collection<Object[]> data() { Collection<Object[]> params = new ArrayList<>(); params.add(new Object[] {"h2-test" }); params.add(new Object[] {"mysql-test" }); return params; } @Before public void setUp() throws Exception { this.testContextManager = new TestContextManager(getClass()); this.testContextManager.prepareTestInstance(this); // maybe I can spinup Spring here with my profile? } @Test public void testRepository() { Assert.assertTrue(test.exists("foo")) }
我如何告诉Spring使用这些不同的配置文件运行每个测试?实际上,每个配置文件都将与不同的数据源(内存h2,外部mysql,外部oracle等)进行通信,因此必须重新初始化我的存储库/数据源。
我知道我可以指定@ActiveProfiles(…),甚至可以从BaseTest扩展并覆盖ActiveProfile批注。 尽管这行得通,但我只展示了我的测试套件的一部分。我的许多测试类都是从BaseTest扩展而来的,我不想为每个类创建几个不同的配置文件存根。目前有效,但难看的解决方案:
谢谢
如果您使用Maven,则实际上可以从命令行指定活动配置文件(或在需要时使用env变量):
mvn clean test -Dspring.profiles.active=h2-test
在这种情况下,使用参数化测试的方法可能不起作用,因为必须在Spring启动其上下文之前指定配置文件。在这种情况下,当您运行参数化集成测试时,上下文将在测试运行程序开始运行测试之前已经启动。同样,出于其他原因发明了JUnit的参数化测试(使用不同的数据序列运行单元测试)。
编辑:还有一件事- 当您决定使用时,@RunWith(Parameterized.class)您将无法使用其他跑步者。在许多情况下(如果不是全部,如果涉及集成测试),您想要指定其他运行程序,例如SpringRunner.class-使用参数化测试,您将无法做到这一点。
@RunWith(Parameterized.class)
SpringRunner.class