Написание хорошего, тестируемого кода может быть трудным.Есть некоторые подводные камни, ожидающие того, что каждый рано или поздно попадет в него.
Как правило, старайтесь избегать внедрения на уровне поля, вместо этого используйте параметр конструктора:
@Service
public class MyService {
private AnotherService anotherService;
@Autowired
MyService (AnotherService anotherService) {
this.anotherService = anotherService;
}
}
Этосамое чистое решение.Вы можете вызывать конструктор из ваших тестов, Spring будет вставлять зависимости таким же образом во время выполнения.Таким образом, нет никакой разницы, с которой нужно иметь дело.
То же самое относится к любым конструкциям жизненного цикла, таким как @PostConstruct
.Если вы можете избежать их, сделайте это.Пусть конструктор справится с этим.Если вам абсолютно необходимо их хранить, то единственное логическое решение - вручную вызвать их из тестового кода.
Теперь, как настроить службы, которые во время выполнения будут автоматически подключаться контейнером?
Для модульного тестирования у вас в основном есть три варианта (в произвольном порядке):
Если требуемый сервис довольно прост и его легко построить, создайте и передайте его какФреймворк будет делать.
Если служба имеет ограниченный интерфейс, который меняется не слишком часто, создайте поддельный сервис.
Используйте насмешкуlib like mockito (spring-boot-test предоставляет его по умолчанию).