代码之家  ›  专栏  ›  技术社区  ›  Knight Industries

在测试应用程序之前初始化Spring Boot测试bean

  •  0
  • Knight Industries  · 技术社区  · 2 年前

    给定一个Spring Boot应用程序,它在启动时执行一些需要模拟服务器的操作:

    @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 没有成功。

    1 回复  |  直到 2 年前
        1
  •  1
  •   M. Deinum    2 年前

    这不是它的工作原理。测试如何能够调用 @Autowired 实例而不启动应用程序上下文?这根本不是它的工作原理,因此你会看到结果。

    但是,由于您只想在构建对象后调用方法,请使用 @PostConstruct .用这个 init 方法将在 MockServer 实例已创建,并已注入所有内容。