如果应用程序无法启动,是不是有可能导致快速 Spring 测试失败?

Posted

技术标签:

【中文标题】如果应用程序无法启动,是不是有可能导致快速 Spring 测试失败?【英文标题】:Is it possible to fail fast Spring tests if the application cannot start?如果应用程序无法启动,是否有可能导致快速 Spring 测试失败? 【发布时间】:2018-07-27 05:21:59 【问题描述】:

我在一个 Spring Boot 模块中有这个基础测试类:

@ActiveProfiles("test")
@SpringBootTest(classes = WebServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class BaseWebServiceTest 
//...

如果由于某种原因应用程序无法启动(在我的情况下,如果 localstack docker 映像未启动,或者 Spring Cloud Contract 存根不可用等),测试仍在运行,显然它们都失败了。如果未加载 ApplicationContext,有什么方法可以跳过所有测试?

【问题讨论】:

【参考方案1】:

如果 ApplicationContext 未加载,是否有任何方法可以跳过所有测试?

没有。如果 ApplicationContext 未加载,则无法自动跳过测试。

但是,您可以利用 JUnit 4 的 假设 支持并根据您选择的一些布尔条件中止测试的执行。例如,如果您可以检查 docker 映像是否启动,则可以执行类似以下的操作。

public static boolean dockerImagedStarted() 
    // return true if the Docker image started...


@BeforeClass
public static void ensureDockerImageStarted() 
    org.junit.Assume.assumeTrue(dockerImagedStarted());

附言请注意,存在一个开放的 JIRA 问题,要求使用内置功能以避免重复尝试加载 ApplicationContext。详情请见SPR-9548。

【讨论】:

因此,唯一的方法是考虑所有可能导致 Spring 应用程序无法启动的原因并在静态方法中处理这些原因:( 如果您希望 Spring 支持这样的功能,请随时在此处投票和/或评论:jira.spring.io/browse/SPR-9548【参考方案2】:

您可以创建一个运行程序,在 ApplicationContext 未加载的情况下忽略您的测试

public class CustomRunner extends BlockJUnit4ClassRunner 
    public CustomRunner(Class<?> clazz) throws InitializationError 
        super(clazz);
    

    @Override
    protected boolean isIgnored(FrameworkMethod child) 
        return shouldIgnore() || super.isIgnored(child);
    

    /**
     * 
     * @return if your test should be ignored or not
     */
    private boolean shouldIgnore() 
        // Some check if your docker is up

        return true;
    

@RunWith 与您创建的CustomRunner 一起使用

@RunWith(CustomRunner.class)
@ActiveProfiles("test")
@SpringBootTest(classes = WebServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class BaseWebServiceTest 
//...

【讨论】:

我的问题是在shouldIgnore() 中放入什么检查。未加载 ApplicationContext 可能有很多原因。理想情况下,我希望能够以某种方式检查 ApplicationContext 是否已加载。有什么选择吗? 嗯,抱歉,我可以考虑一下

以上是关于如果应用程序无法启动,是不是有可能导致快速 Spring 测试失败?的主要内容,如果未能解决你的问题,请参考以下文章

Wix刻录安装程序无法在静默安装时重新启动

万答#15,都有哪些情况可能导致MGR服务无法启动

『叶问』#39,都有哪些情况可能导致MGR服务无法启动

e5v2虚幻引擎打不开

《我的世界》游戏组件冲突或游戏路径配置异常,导致无法启动游戏怎么办?

uniappcli启动不成功未报错