在测试应用程序之前初始化 Spring 引导测试 bean
Initialize Spring Boot test beans before tested Application
给定一个 Spring 启动应用程序,该应用程序在启动时需要模拟服务器:
@SpringBootApplication
public class Application implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.err.println("should be 2nd: application init (needs the mock server)");
}
public boolean doSomething() {
System.err.println("should be 3rd: test execution");
return true;
}
}
因此,模拟服务器应该事先初始化:
@SpringBootTest
@TestInstance(Lifecycle.PER_CLASS)
class ApplicationITest {
@Autowired
MockServer mockServer;
@Autowired
Application underTest;
@BeforeAll
void setUpInfrastructure() {
mockServer.init();
}
@Test
void doSomething() {
assertTrue(underTest.doSomething());
}
}
@Component
class MockServer {
void init() {
System.err.println("should be 1st: mock server init");
}
}
但应用程序似乎总是先初始化:
should be 2nd: application init (needs the mock server)
should be 1st: mock server init
should be 3rd: test execution
我怎样才能让它们按预期的顺序执行?
我尝试使用 Order(Ordered.HIGHEST_PRECEDENCE)
和 @AutoConfigureBefore
但没有成功。
这不是它的工作原理。在没有启动应用程序上下文的情况下,测试如何能够在 @Autowired
实例上调用方法?这根本不是它的工作原理,因此你看到的结果。
然而,由于您只想在构造对象后调用一个方法,请用 @PostConstruct
标记该方法。这样一来 init
方法将在 MockServer
实例创建并注入所有内容后立即调用。
给定一个 Spring 启动应用程序,该应用程序在启动时需要模拟服务器:
@SpringBootApplication
public class Application implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.err.println("should be 2nd: application init (needs the mock server)");
}
public boolean doSomething() {
System.err.println("should be 3rd: test execution");
return true;
}
}
因此,模拟服务器应该事先初始化:
@SpringBootTest
@TestInstance(Lifecycle.PER_CLASS)
class ApplicationITest {
@Autowired
MockServer mockServer;
@Autowired
Application underTest;
@BeforeAll
void setUpInfrastructure() {
mockServer.init();
}
@Test
void doSomething() {
assertTrue(underTest.doSomething());
}
}
@Component
class MockServer {
void init() {
System.err.println("should be 1st: mock server init");
}
}
但应用程序似乎总是先初始化:
should be 2nd: application init (needs the mock server)
should be 1st: mock server init
should be 3rd: test execution
我怎样才能让它们按预期的顺序执行?
我尝试使用 Order(Ordered.HIGHEST_PRECEDENCE)
和 @AutoConfigureBefore
但没有成功。
这不是它的工作原理。在没有启动应用程序上下文的情况下,测试如何能够在 @Autowired
实例上调用方法?这根本不是它的工作原理,因此你看到的结果。
然而,由于您只想在构造对象后调用一个方法,请用 @PostConstruct
标记该方法。这样一来 init
方法将在 MockServer
实例创建并注入所有内容后立即调用。