Как сгенерировать ошибку в приватном методе внутри сервиса с Mockito - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема с попыткой сделать несколько автоматических тестов: у меня есть сервис (весна).Этот сервис предоставляет публичный метод, используемый для процесса.Этот процесс состоит из 3 основных процессов.Эти процессы находятся в закрытых методах и вызывают некоторые другие службы.

Я хочу проверить поведение, когда один из этих 3 частных процессов выдает ошибку.Я понял, что Мокито может помочь мне.Однако я не могу заставить это работать.Поскольку мои три метода являются частными, и я не могу использовать PowerMock, я попытался использовать when (). ThenThrow для открытых методов в другом сервисе, который вызывается моим закрытым методом.

Я получил различные результаты,NullPointerException, процесс, работающий без бросков / ошибок, проблем с зависимостями и т. Д.

Мой код выглядит следующим образом:

 @Test
public void test() throws Throwable {
    Mockito.when(SecondServiceCalledByPrivateMethod.publicMethod(Mockito.any(), Mockito.any()))
            .thenThrow(new Exception("failed!!!"));
    request lRequest = createRequest(myObjects);

    FirstService.executeProcess(lRequest);
}

С классом конфигурации:

@Configuration
public class ConfigClass{

    @Bean
    @Primary
    public SecondService secondService() {
        return Mockito.mock(SecondService.class);
    }

}

Внутренние службы, У меня есть несколько @Autowired и т. Д. Я не знаю, если это имеет значение.Это первый раз, когда я пытаюсь использовать Mockito.Есть ли у вас какие-либо идеи, как заставить это работать или что мне не хватает?

РЕДАКТИРОВАТЬ: мой сервис выглядит следующим образом:

@Service
class MyService {
    @Autowired OtherService dependentService;

    public someObject serviceMethod(Object2) {
        //Some actions
        callProcess(Object2);
    }
    private void callProcess(Object2) {
        // other actions
        dependentService.process(Object3);
    }
}

Он имеет несколько вызовов других служб (@Autowired).Нужно ли им издеваться / шпионить за ними в тесте?

1 Ответ

0 голосов
/ 09 октября 2018

Вы не можете заставить частный метод службы сам выдавать исключение.

Общая концепция, используемая для такого рода вещей, состоит в том, чтобы высмеивать зависимости.

@Service
class MyService {
    @Autowired OtherService dependentService;

    public void serviceMethod() {
        callProcess();
    }
    private void callProcess() {
        dependentService.process();
    }
}

@RunWith(MockitoRunner.class)
public class MyServiceTest {
    // will be injected into the tested service by mockito
    @Mock private OtherService dependentService;
    @InjectMocks private MyService tested;

    @Test
    public void testExceptionOnCallProcess() {
        // mock the exception being thrown by the other service
        when(dependentService.process()).thenThrow(new RuntimeException());
        tested.serviceMethod();
    }
}

Чтовы делаете со своей собственной конфигурацией создание фактического контекста Spring - это сделало бы его интеграционным тестом, и, поскольку у вас нет макетов в них, вы не можете создать фиктивное исключение.Вам придется вызвать один, создав обстоятельства, которые будут выбрасывать, настроив среду и данные соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...