如何使用JUnit5在Micronaut的Controller Test中模拟服务类?

时间:2019-06-04 17:11:07

标签: junit5 micronaut

我正在为我的micronaut应用程序中的控制器编写一个JUnit测试用例。控制器具有GET端点,该端点调用我的服务类中的方法。我收到了NullPointerException,因此我假设我的服务类可能未正确模拟,但是我不确定。我正在使用@Mock(Mockito)提供服务。

我使用正确的注释来模拟服务层吗?我曾尝试在Google上进行搜索,但并没有给我太多帮助。谢谢。

@MicronautTest
public class FPlanControllerTest {

private static final String url = "dummy_url";

@Inject
FPlanService fplanService;

@Inject
@Client("/")
RxHttpClient client;

@Test
public void testGetLayout() {
    FPlanUrl expectedFPlanUrl = new FPlanUrl(url);
    when(fplanService.getLayoutUrl(Mockito.anyString(), Mockito.anyString()))
                .thenReturn(expectedFPlanUrl);
        FPlanUrl actualFPlanUrl = client.toBlocking()
                .retrieve(HttpRequest.GET("/layout/1000545").header("layoutId", "7"), FPlanUrl.class);
        assertEquals(expectedFPlanUrl , actualFPlanUrl);
    }

@MockBean(FPlanService.class)
    FPlanService fplanService() {
        return mock(FPlanService.class);
    }
}

我收到以下错误。

com.apartment.controller.FPlanControllerTest.testGetLayout(FPlanControllerTest.java:44)上的java.lang.NullPointerException

3 个答案:

答案 0 :(得分:1)

使用@MockBean(io.micronaut.test.annotation.MockBean)。

文档-https://micronaut-projects.github.io/micronaut-test/latest/guide/#junit5

答案 1 :(得分:0)

我弄清楚出了什么问题。因为HTTP响应期望的是字符串而不是FPlanUrl对象,所以这给出了空指针异常。正确的代码如下:

@Test
public void testGetLayout() {
    FPlanUrl expectedFPlanUrl = new FPlanUrl("http://dummyurl.com");
    when(fplanService.getLayoutUrl(Mockito.anyString(), Mockito.anyString()))
            .thenReturn(expectedFPlanUrl);
    Assertions.assertEquals("{\"url\":\"http://dummyurl.com\"}", client.toBlocking().retrieve(HttpRequest.GET("/layout/123").header("layoutId", "7"), String.class);
    verify(fplanService).getLayoutUrl("123","7");
}

答案 2 :(得分:0)

简单地尝试模拟如下:-

@MockBean(MyService.class)
MyService myService() {
    return mock(MyService.class);
}

现在可以将服务注入为:-

@Inject
private MyService myService;

在您的测试方法中使用:-

@Test
public void myServiceTest() {
    when(myService.foo(any())).thenReturn(any());

    MutableHttpResponse<FooResponse> response = controller.bar(new 
    MyRequest());
    Assertions.assertNotNull(response);
}