如何集成测试 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。
我们目前有集成测试基地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。