如何使用 JUnit5 在 Micronaut 的控制器测试中模拟服务 class?

How can I mock the service class in my Controller Test in Micronaut using JUnit5?

我正在为我的 micronaut 应用程序中的控制器编写 JUnit 测试用例。控制器有一个 GET 端点,它调用我的服务 class 中的一个方法。我得到一个 NullPointerException,所以我假设我的服务 class 可能没有被正确模拟,但是我不确定。我正在使用 @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);
    }
}

我收到以下错误。

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

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

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

我知道出了什么问题。这给出了 NullPointerException,因为 HTTP 响应期望的是 String 而不是 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");
}

简单地尝试模拟如下:-

@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);
}