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.
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:
@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)spring.main.web-environment=false
to disable the web server (but that's silly given the point above)DummyProperties
of yours. You don't even need to start a Spring Boot application for that. Look at our own test suiteI'd definitely go with the last one. Maybe you have a good reason to have an integration test for that?