SprintBootTest - создавать только необходимые бины
У меня есть код, подобный следующему:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ModelRunnerTest {
@Autowired
private SomeRepository repository;
@Autowired
private SomeSearcher someSearcher;
@Test
public void test(){
someSearcher.search(repository);
}
}
Это работает, но также создает все bean-компоненты в том же контексте, что и 2 созданные bean-компонента. Это может занять много времени (и я запускаю этот тест при каждой сборке / развертывании).
Итак, я хотел бы найти способ для теста загружать только необходимые bean-компоненты для теста. В этом примере это будет только репозиторий и someSearcher.
Я знаю, что могу предоставить альтернативную реализацию для bean-компонентов, использующих @BeanMock, но фактические реализации для bean-компонентов все равно будут созданы (хотя и не используются).
Какие-либо предложения?
1 ответ
Вы могли бы использовать @ContextConfiguration
вместо @SpringBootTest
создать собственный контекст Spring для определенных классов. Spring Boot еще больше упрощает это с классами, разработанными для конкретных случаев использования, например @WebMvcTest
или же @DataJdbcTest
,
Этот подход, однако, имеет два основных недостатка:
Что вы на самом деле тестируете в этом новом ограниченном контексте? Определенно не производственное приложение, так как вы не запускаете весь контекст Spring. Это может привести к ошибкам, пропущенным тестами, например, могут не быть обнаружены проблемы с переопределением bean-компонентов.
SpringRunner
будет пытаться повторно использовать контекст Spring между тестами, если это возможно. Запуск одного большого контекста один раз и совместное использование его во всех тестах может быть быстрее, если у вас есть несколько тестов.