Как модульно протестировать метод возврата void, в котором поля класса-владельца являются частными, а Spring @Autowired

#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();
      }
}