停止 Spring 启动测试命中 SpringBootApplication class 的 @PostContruct
Stop Spring Boot Test from hitting @PostContruct of SpringBootApplication class
我有一个 SpringBootApplication class,它有一个类似 @PostConstruct
的方法(它初始化数据库连接的类型):
@SpringBootApplication
public class SpringBootApp extends WebMvcConfigurerAdapter {
public static boolean workOffline = false;
private boolean setupSchema = false;
private IGraphService graphService;
private DbC conf;
@Autowired
public SpringBootApp(IGraphService graphService, DbC conf)
{
this.graphService = graphService;
this.conf = conf;
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootApp.class, args);
}
@PostConstruct
public void initializeDB() {
if (workOffline) {
conf.setupOfflineEnvironment();
return;
}
else {
conf.setupProdEnvironment();
}
if (setupSchema) {
graphService.setupTestUsers();
}
}
}
我也在使用 Spring 引导测试 extend
这个基础 class:
@RunWith(SpringRunner.class)
@Ignore
@SpringBootTest
public class BaseTest {
@Before
public void beforeTest() {
if (SpringBootApp.workOffline) {
conf.setupOfflineEnvironment();
} else {
conf.setupTestEnvironment();
}
graphService.setupTestUsers();}
@After
public void afterTest() {
graphService.deleteAllData();
}
}
我的测试在 tests/
下,而我的源代码在 src/
下
不幸的是,有些情况下 beforeTest()
会在 @PostConstuct
之前执行,有些情况下它会在 @PostConstuct
之后执行。有没有办法让我的测试 运行 和 @SprinbBootTest
完全没有 entering/constructiong SpringBootApp
class?
谢谢!
根据要求,这里尝试使用 spring 属性(没有 IDE 方便,所以请原谅任何错误)
您可以使用 SpringBootTest#properties
为您的测试设置 属性
@RunWith(SpringRunner.class)
@Ignore
@SpringBootTest(properties="springBootApp.workOffline=true")
public class BaseTest {
@Before
public void beforeTest() { /* setup */ }
@After
public void afterTest() { /* teardown */ }
}
现在我们知道可以在测试中设置 spring 属性,我们可以设置应用程序以使用 属性:
@SpringBootApplication
public class SpringBootApp extends WebMvcConfigurerAdapter {
@Value("${springBootApp.workOffline:false}")
private boolean workOffline = false;
@Value("${springBootApp.setupSchema:false}")
private boolean setupSchema = false;
@PostConstruct
public void initializeDB() {
if (workOffline) {
// ...
} else {
// ...
}
if (setupSchema) {
// ...
}
}
}
在我写这个答案时,我注意到几件事:
- 如果您只设置
workOffline
以便可以 运行 测试,那么您可能只想将数据库设置操作移出应用程序并移至 BaseTest
class 代替。
setupSchema
也一样
- 如果您正在为测试执行 sql,请不要忘记
@Sql
和 @SqlGroup
:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#__sql
总之,祝你好运!
我有一个 SpringBootApplication class,它有一个类似 @PostConstruct
的方法(它初始化数据库连接的类型):
@SpringBootApplication
public class SpringBootApp extends WebMvcConfigurerAdapter {
public static boolean workOffline = false;
private boolean setupSchema = false;
private IGraphService graphService;
private DbC conf;
@Autowired
public SpringBootApp(IGraphService graphService, DbC conf)
{
this.graphService = graphService;
this.conf = conf;
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootApp.class, args);
}
@PostConstruct
public void initializeDB() {
if (workOffline) {
conf.setupOfflineEnvironment();
return;
}
else {
conf.setupProdEnvironment();
}
if (setupSchema) {
graphService.setupTestUsers();
}
}
}
我也在使用 Spring 引导测试 extend
这个基础 class:
@RunWith(SpringRunner.class)
@Ignore
@SpringBootTest
public class BaseTest {
@Before
public void beforeTest() {
if (SpringBootApp.workOffline) {
conf.setupOfflineEnvironment();
} else {
conf.setupTestEnvironment();
}
graphService.setupTestUsers();}
@After
public void afterTest() {
graphService.deleteAllData();
}
}
我的测试在 tests/
下,而我的源代码在 src/
不幸的是,有些情况下 beforeTest()
会在 @PostConstuct
之前执行,有些情况下它会在 @PostConstuct
之后执行。有没有办法让我的测试 运行 和 @SprinbBootTest
完全没有 entering/constructiong SpringBootApp
class?
谢谢!
根据要求,这里尝试使用 spring 属性(没有 IDE 方便,所以请原谅任何错误)
您可以使用 SpringBootTest#properties
为您的测试设置 属性@RunWith(SpringRunner.class)
@Ignore
@SpringBootTest(properties="springBootApp.workOffline=true")
public class BaseTest {
@Before
public void beforeTest() { /* setup */ }
@After
public void afterTest() { /* teardown */ }
}
现在我们知道可以在测试中设置 spring 属性,我们可以设置应用程序以使用 属性:
@SpringBootApplication
public class SpringBootApp extends WebMvcConfigurerAdapter {
@Value("${springBootApp.workOffline:false}")
private boolean workOffline = false;
@Value("${springBootApp.setupSchema:false}")
private boolean setupSchema = false;
@PostConstruct
public void initializeDB() {
if (workOffline) {
// ...
} else {
// ...
}
if (setupSchema) {
// ...
}
}
}
在我写这个答案时,我注意到几件事:
- 如果您只设置
workOffline
以便可以 运行 测试,那么您可能只想将数据库设置操作移出应用程序并移至BaseTest
class 代替。 setupSchema
也一样
- 如果您正在为测试执行 sql,请不要忘记
@Sql
和@SqlGroup
:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#__sql
总之,祝你好运!