I have a Spring Boot 1.4.2 application. Some code that is used during startup looks like this:
@Component class SystemTypeDetector{ public enum SystemType{ TYPE_A, TYPE_B, TYPE_C } public SystemType getSystemType(){ return ... } } @Component public class SomeOtherComponent{ @Autowired private SystemTypeDetector systemTypeDetector; @PostConstruct public void startup(){ switch(systemTypeDetector.getSystemType()){
There is a component that determines the type of system. This component is used during startup from other components. Everything works fine in production.
Now I want to add some integration tests using Spring 1.4 @MockBean .
The test looks like this:
@RunWith(SpringRunner.class) @SpringBootTest(classes = MyWebApplication.class, webEnvironment = RANDOM_PORT) public class IntegrationTestNrOne { @MockBean private SystemTypeDetector systemTypeDetectorMock; @Before public void initMock(){ Mockito.when(systemTypeDetectorMock.getSystemType()).thenReturn(TYPE_C); } @Test public void testNrOne(){
Mostly bullying works fine. My systemTypeDetectorMock is used, and if I call getSystemType TYPE_C returned.
The problem is that the application does not start. At the moment, the working order of the springs seems to be:
- create all Mocks (without configuration, all methods return zero)
- launch the application
- call @ Before methods (where layouts will be configured)
- start test
My problem is that the application starts with an uninitialized layout. So calling getSystemType() returns getSystemType() .
My question is: how can I customize the layouts before running the application?
Edit: If anyone has the same problem, one of the workarounds is to use @MockBean(answer = CALLS_REAL_METHODS) . This calls the real component, and in my case the system starts up. After starting, I can change the behavior layout.
source share