在测试应用程序之前初始化 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 实例创建并注入所有内容后立即调用。