如何集成测试 Spring 启动具有多个配置的应用程序

How to integration test Spring Boot application with multiple configurations

我们目前有集成测试基地class

@SpringApplicationConfiguration(classes = { MyApp.class, TestConfig.class })
@IntegrationTest({
  "foo:bar",
  "baz:qux"
})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class BaseIntegrationTest {
   ...
}

我们想要做的是为单个测试 class 添加一个参数到 @IntegrationTest。这在 运行 单独测试时效果很好,但是当 运行 所有测试时,不添加参数。

有办法解决这个问题吗?例如,为单个测试启动一个新应用 class?

基本上,我想做的是:

public class TestOne extends BaseIntegrationTest { ... }

@IntegrationTest({
  "foo:zorblax"
})
public class TestTwo extends BaseIntegrationTest { ... }

好像把base分开了类,应用就分开配置了

我最后做了什么:

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class BaseIntegrationTest {
  // Common methods and fields,
  // @Before, @PostConstruct, etc.
}

@SpringApplicationConfiguration( classes = {...} )
@IntegrationTest({
  "foo:bar",
  "bar:baz"
})
public abstract class WithParamsOne extends BaseIntegrationTest {
  // empty
}

@SpringApplicationConfiguration( classes = { /* Different */ } )
@IntegrationTest({
  "foo:zorblax"
})
public abstract class WithParamsTwo extends BaseIntegrationTest {
  // empty
}

public class ActualTest extends WithParamsOne {
  // @Test
}

public class SecondActualTest extends WithParamsTwo {
  // @Test
}

您可以使用配置文件来设置其他属性。可以使用注释 @ActiveProfiles 激活它们。您还可以在一次测试中组合配置文件。

根据之前的回答,您可以创建配置文件 "param_one" 和 "param_two"。可以通过特定于配置文件的 属性 文件设置属性:application-param_one.properties 和 application-param_two.properties

@SpringApplicationConfiguration(...)
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class BaseIntegrationTest {
}

@ActiveProfiles("param_one")
public class FirstParamTest extends BaseIntegrationTest {
}

@ActiveProfiles("param_two")
public class SecondParamTest extends BaseIntegrationTest {
}

@ActiveProfiles({ "param_one", "param_two" })
public class AllParamsTest extends BaseIntegrationTest {
}

另见 Reference Guide