停止 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) {
            // ...
        }
    }
}

在我写这个答案时,我注意到几件事:

总之,祝你好运!