#junit4 #private-members #spring-bean #jmock
#junit4 #private-члены #spring-bean #jmock
Вопрос:
Мне было поручено модульное тестирование класса, в котором его поля автоматически подключаются к Spring beans. Вызываемый основной общедоступный метод process
ничего не возвращает. Вот фрагмент класса:
public class AutoRejector{
@Autowired
private MNPServicesWrapper mnpWrapper;
//some more autowired fields
public void process() {
List<RequestInfo> requests = mnpWrapper.getNewMnpRequests();
........
}
}
MNPServicesWrapper — это интерфейс. Во время тестирования я хочу предоставить свою собственную тестовую реализацию, которая будет возвращать некоторые тестовые значения при getNewMnpRequests
вызове метода.
Если бы я мог установить это поле с помощью конструктора или установщика, это было бы просто. Но как мне установить поле @Autowired?
Комментарии:
1. Читайте о насмешках
Ответ №1:
Вы можете использовать макетные фреймворки, такие как Mockito и PowerMock. Они помогают вводить поддельные объекты в ваш тестовый класс. Затем вы можете указать, какой метод возвращает. (Они используют отражения для внедрения тестового объекта. Вы можете сделать то же самое без использования Mockito, используя отражения) Для вашего метода void вы можете утверждать, что количество раз mnpWrapper.getNewMnpRequests()
вызывается с использованием одной из этих фреймворков-насмешек.
Пожалуйста, прочитайте больше о Mockito, импортируйте JAR и используйте в своем JAVA-проекте.
Тестовый пример вашего кода в Mockito будет:
@RunWith(MockitoJUnitRunner.class)
public class AutoRejectorTest {
@Mock
MNPServicesWrapper mnpWrapper;
@InjectMocks
AutoRejector autoRejector;
@Test
public void processTest(){
autoRejector.process();
//Assert that the getNewMnpRequests method was called exactly once
Mockito.verify(mnpWrapper,times(1)).getNewMnpRequests();
}
}