如何使用 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);
}
我正在为我的 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);
}