SpringBootTest - как подтвердить, что загрузка контекста не удалась - PullRequest
1 голос
/ 03 июня 2019

Я написал ApplicationListener , который должен проверять, подготовлена ​​ли среда во время инициализации контекста.У меня возникают проблемы при тестировании сценария, так как я добавляю слушателя вручную в моих configure () и main () методов.

Класс ApplicationListener:

public class EnvironmentPrepared implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {

        @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
            //code that checks if conditions are met

            if (checkTrue) {
            throw new RuntimeException();
        }
    }
}

Основной класс:

    public class MyApp extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        setRegisterErrorPageFilter(false);
        return application.listeners(new EnvironmentPrepared()).sources(MyApp.class);
    }

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MyApp.class);
        springApplication.addListeners(new EnvironmentPrepared());
        springApplication.run(args);
    }
}

Тест, который я хочу выполнить:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(loader = OverriddenProfilesTest.CustomLoader.class)
public class OverriddenProfilesTest {

    public static class CustomLoader extends SpringBootContextLoader {

        @Override
        protected SpringApplication getSpringApplication() {
            SpringApplication app = super.getSpringApplication();
            app.addListeners(new EnvironmentPrepared());
            return app;
        }
    }

    /**
     * Checks if spring can bootstrap everything 
     */
    @Test(expected = RuntimeException.class)
    public void test() {

    }
}

Это будет тест, который я хочу. RuntimeException выдается, но исключение происходит во время инициализации контекста, поэтому тест даже не запускается.

1 Ответ

2 голосов
/ 06 июня 2019

Вот решение, которое я использовал.Я удалил ручное добавление слушателя в приложение и использовал вместо него файл spring.factories.

Что касается теста, я сначала создал собственный класс бегуна:

    public class SpringRunnerWithExpectedExceptionRule extends SpringJUnit4ClassRunner {

public SpringRunnerWithExpectedExceptionRule(Class<?> clazz) throws InitializationError {
    super(clazz);
}

@Override
protected Statement methodBlock(FrameworkMethod frameworkMethod) {
    List<ExpectedException> testRules = getTestClass().getAnnotatedFieldValues(null, ExpectedExceptionClassRule.class, ExpectedException.class);
    Statement result = super.methodBlock(frameworkMethod);
    for (TestRule item : testRules) {
        result = item.apply(result, getDescription());
    }
    return result;
}}

Затем я создаю следующееаннотация:

@Retention(RUNTIME)
@Target({ FIELD })
public @interface ExpectedExceptionClassRule {

}

И, наконец, я смог запустить тест с моим бегуном:

@RunWith(SpringRunnerWithExpectedExceptionRule.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OverriddenProfilesTest {

    @ExpectedExceptionClassRule
    public static ExpectedException expectedException = ExpectedException.none();

    @BeforeClass
    public static void before() {
        expectedException.expectCause(runtimeExceptionMethod());
    }


    @Test
    public void testThatShouldThrowExceptionWhileSettingContext {
    }

    static Matcher<Throwable> runtimeExceptionMethod() {
        return new IsRuntimeException();
    }

    static class IsRuntimeException extends TypeSafeMatcher<Throwable> {
    //do stuff
    }

Подробнее о решении можно узнать здесь .

...