Заглушка закрытых методов в тестируемом классе в junit 5, PowerMock не работает с JUnit5 - PullRequest
2 голосов
/ 29 мая 2020

Я хочу заглушить частный метод в тестируемом классе. Я использую junit 5. Я использовал ранее powermock, чтобы достичь этого. К сожалению, junit 5 не работает с powermock.

Я упростил пример, чтобы лучше объяснить проблему. У меня есть класс с частным вспомогательным методом, который вызывается внутри методов publi c. Как показано ниже:

public class Service {
    private Repository repository;

    public Object findById(String id) {
        Object object = repository.findById(id);
        object = verify(object);
        return object;
    }

    private Object verify(Object object) {
        //removed for simplicity
        return object;
    }
}

Теперь я хочу провести модульное тестирование метода findById из Service. Я использовал junit 5 с mockito для реализации модульного теста для класса Service.

public class ServiceUTest {
    @InjectMocks
    private Service service;
    @Mock
    private Repository repository;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindById() {
        when(repository.findById(Mockito.any())).thenReturn(new Object());
        //how to stub verify method
    }
}

Я был бы признателен за любую помощь и руководство по решению этой проблемы.

С уважением,

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Как правило, юнит-тест предназначен для проверки интерфейса publi c модуля.

Заглушка закрытых методов - плохая идея. В этом случае ваши тесты тесно связаны с деталями реализации. И обычно вы хотите протестировать поведение, но не реализацию.

Я предлагаю вернуть из repository такой объект, который будет соответствовать логу проверки c так, как вы хотели его заглушить.

Другой подход к решению таких проблем - переместить из интересных кусочков в новый класс. Итак, вы можете внедрить его как зависимость в свой сервис. Например, вы можете использовать Шаблон спецификации для извлечения журнала проверки c.

0 голосов
/ 30 мая 2020

Вы можете шпионить за службой и использовать PowerMockito для определения поведения метода verify().

public class ServiceUTest {

    @InjectMocks
    private Service service;

    @Mock
    private Repository repository;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindById() {
        // Arrange
        Service spyService = spy(service);
        when(repository.findById(Mockito.any())).thenReturn(new Object());
        PowerMockito.when(spyService, "verify", any()).thenReturn(expectedObjectReturn);

        // Act
        Object actual = spyService.findById("id");

        // Assert
    }
}
...