如果应用程序无法启动,是否可能无法快速执行Spring测试?

时间:2018-02-16 10:11:57

标签: spring spring-boot junit spring-test

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

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

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

2 个答案:

答案 0 :(得分:2)

  

如果未加载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());
}

P.S。请注意,有一个开放的JIRA问题,要求内置功能,以避免重复尝试加载ApplicationContext。有关详细信息,请参阅SPR-9548

答案 1 :(得分:1)

如果未加载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 {
//...
}