Как я могу использовать Mockito.doThrow в тесте для микронавтов, чтобы имитировать исключения, генерируемые вызовом службы? - PullRequest
0 голосов
/ 25 мая 2019

Я хочу смоделировать несколько возможных исключений, возникающих во время вызова метода службы. Я написал следующий тест для микронавтов (я использую микронавт 1.1.2 ):

@MicronautTest
public class HelloWorldControllerTest {

   @Inject
   private AcmeService acmeService;
   @Inject
   @Client("/")
   private RxHttpClient client;

   @MockBean(AcmeService.class)
   public AcmeService acmeService() {
      return Mockito.mock(AcmeService.class);
   }

   @Test
   public void test_without_exception() {

      HttpResponse httpResponse = client.toBlocking().exchange(HttpRequest.GET("/"));
      Assertions.assertEquals(HttpStatus.OK, httpResponse.getStatus());
   }

   @Test
   public void test_with_nullpointer_exception() {

      Mockito.doThrow(new NullPointerException("nullpointer"))
            .when(acmeService)
            .doSomething(Mockito.anyString());

      HttpClientResponseException responseException = Assertions.assertThrows(HttpClientResponseException.class,
            () -> client.toBlocking().exchange(HttpRequest.GET("/")));

      Assertions.assertEquals("Internal Server Error: nullpointer", responseException.getMessage());
   }

   @Test
   public void test_with_illegal_argument_exception() {

       Mockito.doThrow(new IllegalArgumentException("illegal"))
            .when(acmeService)
            .doSomething(Mockito.anyString());

       HttpClientResponseException responseException = Assertions.assertThrows(HttpClientResponseException.class,
            () -> client.toBlocking().exchange(HttpRequest.GET("/")));

       Assertions.assertEquals("Internal Server Error: illegal", responseException.getMessage());
   }
}

Проблема в том, что при выполнении всего класса теста выполняется только первый тестовый этап, второй и третий сбой, потому что не выдается исключение (я ожидаю, что выдается исключение). Но если я выполняю каждый тест отдельно, каждый проход теста (исключение выдается, как ожидалось).

Перемешивание AcmeService работает неправильно. Я также пытался сбросить макет (Mockito.reset) после каждого теста, но это тоже не работает.

Я не могу имитировать исключения, возникающие при выполнении сервиса. Отладка показывает, что в каждом тестовом случае поддельный сервис отличается. Пересмотренная служба, используемая контроллером hello world, также отличается (поэтому она не работает).

Примеры насмешек https://micronaut -projects.github.io / micronaut-test / latest / guide / index.html не показывают различий.

Итак, мой вопрос: как я могу имитировать различные исключения, выдаваемые службой? Почему мой тест не работает?

Я ценю ваши мысли.

...