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,

Этот подход, однако, имеет два основных недостатка:

  1. Что вы на самом деле тестируете в этом новом ограниченном контексте? Определенно не производственное приложение, так как вы не запускаете весь контекст Spring. Это может привести к ошибкам, пропущенным тестами, например, могут не быть обнаружены проблемы с переопределением bean-компонентов.

  2. SpringRunner будет пытаться повторно использовать контекст Spring между тестами, если это возможно. Запуск одного большого контекста один раз и совместное использование его во всех тестах может быть быстрее, если у вас есть несколько тестов.

Другие вопросы по тегам