我正在为我的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
答案 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);
}