У меня служба весенней загрузки с методом @PostConstruct
.В некоторых интеграционных тестах этот метод не должен выполняться (служба в этих интеграционных тестах вообще не используется).Поэтому я подумал, что могу просто позволить создать бин с new
внутри класса конфигурации, загруженного внутри этого теста (@ContextConfiguration
).
Однако это не работает, как я думал.@PostConstruct
вызывается в любом случае, даже дважды, как вы можете видеть ниже ( да, это весь код ):
Приложение
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Сервис
@Service
public class MyService {
@PostConstruct
public void startup() {
System.out.println("@PostConstruct - " + this);
}
}
Тест
@RunWith(SpringRunner.class)
@SpringBootTest(
webEnvironment = WebEnvironment.RANDOM_PORT,
classes = {DemoApplication.class})
@ContextConfiguration(classes = TestConfiguration.class)
public class DemoApplicationTests {
@Test
public void test() {
System.out.println("Test");
}
@Configuration
static class TestConfiguration {
@Bean
public MyService xxx() {
MyService myService = new MyService();
System.out.println("@Bean - " + myService);
return myService;
}
}
}
Если тест выполнен, выводится следующий вывод:
:: Spring Boot :: (v2.1.1.RELEASE)
...
2018-11-30 20:34:28.422 INFO 16916 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-11-30 20:34:28.422 INFO 16916 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1573 ms
@PostConstruct - com.example.demo.MyService@41c89d2f
@Bean - com.example.demo.MyService@2516fc68
@PostConstruct - com.example.demo.MyService@2516fc68
2018-11-30 20:34:28.838 INFO 16916 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2018-11-30 20:34:29.086 INFO 16916 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 62040 (http) with context path ''
2018-11-30 20:34:29.090 INFO 16916 --- [ main] com.example.demo.DemoApplicationTests : Started DemoApplicationTests in 2.536 seconds (JVM running for 4.187)
Test
2018-11-30 20:34:29.235 INFO 16916 --- [ Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
Кто-нибудь может мне это объяснить?
- почему первый
@PostConstruct
называется - почему во-вторых
@PostConstruct
вызывается для компонента, построенного с new
.Почему этим бином управляет весна? - Как мне достичь того, что мне нужно?
Редактировать :
Я пытался вернуть бин, созданный с помощьюMockito.mock(...)
вместо того, чтобы создавать его с new
.Это помогает в том смысле, что второй @PostConstruct
не выполняется.Таким образом, остается вопрос: почему первый?И как от этого тоже избавиться?