如果应用程序无法启动,是不是有可能导致快速 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 测试失败?的主要内容,如果未能解决你的问题,请参考以下文章