Если вы запускаете самодельный код отражения внутри теста, то, вероятно, протестированный код можно сделать лучше.
Не весь код автоматически тестируется юнитами. Чтобы иметь возможность проверить код, вы должны написать его определенным образом.
Вы показали тест в фрагменте кода в вопросе, но код, который вы тестируете, также очень важен здесь.
Из первого абзаца вопроса я предполагаю, что у вас есть что-то вроде этого:
class MyDao {
@Autowired
private SomeService service;
public void saveInDb() {
// do something with db
service.sendData();
}
}
Поскольку автоматическое подключение не происходит во время теста (потому что в модульном тесте у вас нет Spring, чтобы сотворить его магию), вам сложно протестировать saveInDb
метод
Однако этот код проблематичен и может быть реорганизован для лучшего модульного тестирования:
Итак, вот совет: не используйте Autowiring для полей, вместо этого перепишите код с помощью Constructor Injection:
class MyDao {
private SomeService service;
@Autowired // you can even omit this annotation in recent versions of spring
// spring will understand what should be injected if there is only one
// constructor in the class
public MyDao(SomeService service) {
this.service = service;
}
}
Если вы чувствуете, что это много кода, вы даже можете использовать проект Lombok для генерации конструктора для вас, но это выходит за рамки вопроса ...
Так или иначе, у вас теперь есть класс с четко определенным списком зависимостей, который должен быть указан в тесте, который пытается создать экземпляр этого класса.
Здесь упрощается юнит-тестирование:
SomeService someService = Mockito.mock(SomeService.class);
MyDao underTest = new MyDao(someService);
В отличие от предыдущего ответа Юаня Цинфея, я не предлагаю использовать такие инструменты, как PowerMock / PowerMockito, рассмотрите возможность их использования, только если вы не можете вносить изменения в тестируемый код (обычно это верно для старых проектов, написанных без тестирования в ум)