如何在micronaut测试中使用Mockito.doThrow模拟服务调用引发的异常?

时间:2019-05-25 10:45:09

标签: unit-testing mockito micronaut

我想模拟在服务方法调用期间抛出的一些可能的异常。我编写了以下micronaut测试(我正在使用micronaut 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的嘲讽示例没有区别。

所以,我的问题是,如何模拟服务抛出的不同异常。为什么我的测试无法正常工作?

感谢您的想法。

0 个答案:

没有答案