Как я могу смоделировать класс обслуживания в моем тесте контроллера в Micronaut, используя JUnit5?

Я пишу тестовый пример JUnit для контроллера в своем приложении micronaut. Контроллер имеет конечную точку 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);
    }
}

Я получил следующую ошибку.

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

person neha    schedule 04.06.2019    source источник


Ответы (3)


Используйте @MockBean (io.micronaut.test.annotation.MockBean).

Документы — https://micronaut-projects.github.io/micronaut-test/latest/guide/#junit5

person kTest    schedule 05.06.2019
comment
Я попробовал @MockBean, но получил сообщение об ошибке, что аннотация запрещена для этого места. В руководстве «@MockBean» используется, когда служба реализует интерфейс. Мой класс обслуживания не реализует никакого интерфейса. - person neha; 06.06.2019
comment
После исправления исключения nullpointer мне пришлось использовать '@MockBean' для внедрения моего сервисного слоя, поскольку он дал мне отсутствующее исключение methodInvocationException. Спасибо за это! - person neha; 08.06.2019

Я понял, что пошло не так. Это давало 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");
}
person neha    schedule 06.06.2019

Просто попробуйте издеваться, как показано ниже: -

@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);
}
person Akash Verma    schedule 08.04.2021