Search code examples
springjunitspring-bootspring-test

What is the best way to test that a spring application context fails to start?


I use the spring-boot-starter-web and spring-boot-starter-test.

Let's say I have a class for binding configuration properties:

@ConfigurationProperties(prefix = "dummy")
public class DummyProperties {

    @URL
    private String url;

    // getter, setter ...

}

Now I want to test that my bean validation is correct. The context should fail to start (with a specfic error message) if the property dummy.value is not set or if it contains an invalid URL. The context should start if the property contains a valid URL. (The test would show that @NotNull is missing.)

A test class would look like this:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@IntegrationTest({ "dummy.url=123:456" })
public class InvalidUrlTest {
    // my test code
}

This test would fail because the provided property is invalid. What would be the best way to tell Spring/JUnit: "yep, this error is expected". In plain JUnit tests I would use the ExpectedException.


Solution

  • Why is that an integration test to begin with? Why are you starting a full blown Spring Boot app for that?

    This looks like unit testing to me. That being said, you have several options:

    • Don't add @IntegrationTest and Spring Boot will not start a web server to begin with (use @PropertySource to pass value to your test but it feels wrong to pass an invalid value to your whole test class)
    • You can use spring.main.web-environment=false to disable the web server (but that's silly given the point above)
    • Write a unit test that process that DummyProperties of yours. You don't even need to start a Spring Boot application for that. Look at our own test suite

    I'd definitely go with the last one. Maybe you have a good reason to have an integration test for that?