Боб Mockito с методом Service Activator - PullRequest
0 голосов
/ 30 марта 2020

Я пишу класс Test для тестирования моего активатора службы (клиент mqtt) с Mockito и Junit5, мой класс находится под этим, но я хочу переписать его в своем тесте, и я использую do Answer..when .. для метода test @ ServiceActivator :

@Configuration
public class DataHandler  {
private static final Logger logger = LoggerFactory.getLogger(DataHandler.class);

@Autowired ApplicationContext context;
@Autowired ElasticConfiguration elasticConfiguration;

@Bean
@ServiceActivator(inputChannel = "topicChannel")
public MessageHandler handler() {
    ObuIndexRepository obuIndexRepository = elasticConfiguration.getObuRepository();

    return message -> {
        ObuModel model = JsonUtility.convertToOduModel(String.valueOf(message.getPayload()));
        boolean condition = DataProcessor.processOduModel(model);
        logger.info(String.valueOf(condition));
        Producer.ProducerGateway gw = context.getBean(Producer.ProducerGateway.class);
        if (condition){
            gw.sendToMqtt("Non hai superato il limite di velocità!", Parameters.TOPICS[1]);
        }else{
            gw.sendToMqtt("Hai superato il limite di velocità!", Parameters.TOPICS[1]);
        }
        obuIndexRepository.save(model);
        logger.info("Record correctly inserted into ElasticSearch cluster ...");
    };
}

TEST класса:

@ExtendWith(MockitoExtension.class)
public class ApplicationTest {

@Mock
private DataHandler dataHandler;
  @Test
  public void testMqtt_1() throws IOException {
    doAnswer((message)->
    {assertTrue("messaggio di Test".equals(message.getArgument(0)));
     return null;
    }).when(dataHandler).handler().handleMessage(any(Message.class));


    dataHandler.handler().handleMessage(new GenericMessage<String>("messaggio di Test"));
    Mockito.verify(dataHandler).handler().handleMessage(new GenericMessage<>("messaggio di Test"));

    }

, но когда я запускаю этот класс, у меня появляется эта ошибка:

java.lang.NullPointerException
at it.communication.ApplicationTest.testMqtt_1(ApplicationTest.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:171)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:167)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:114)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Suppressed: org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at it.almaviva.communication.ApplicationTest.testMqtt_1(ApplicationTest.java:40)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.
        at org.mockito.junit.jupiter.MockitoExtension.afterEach(MockitoExtension.java:211)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterEachCallbacks$11(TestMethodTestDescriptor.java:218)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$13(TestMethodTestDescriptor.java:230)
        at java.util.ArrayList.forEach(ArrayList.java:1257)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAllAfterMethodsOrCallbacks(TestMethodTestDescriptor.java:228)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAfterEachCallbacks(TestMethodTestDescriptor.java:217)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:120)
        ... 41 more

Как я могу сделать это без ошибок? С уважением

1 Ответ

1 голос
/ 30 марта 2020

Вы пытаетесь смоделировать вызов handleMessage, но никогда не издеваетесь над вызовом handler()

doAnswer((message)->
    {assertTrue("messaggio di Test".equals(message.getArgument(0)));
     return null;
    }).when(dataHandler).handler().handleMessage(any(Message.class));

Следовательно, ваш код завершается ошибкой с NPE при вызове handleMessage для нулевого объекта.

Правильный код:

@ExtendWith(MockitoExtension.class)
public class ApplicationTest {

    @Mock
    private DataHandler dataHandler;

    @Mock
    private MessageHandler messageHandler;

    @Test
    public void testMqtt_1() throws IOException {
        doReturn(messageHandler).when(dataHandler).handler();
        doAnswer((answer) ->
        {
            Message<?> message = answer.getArgument(0);
            assertEquals("messaggio di Test", message.getPayload());
            return null;
        }).when(messageHandler).handleMessage(any(Message.class));


        dataHandler.handler().handleMessage(new GenericMessage<>("messaggio di Test"));
        Mockito.verify(messageHandler).handleMessage(new GenericMessage<>("messaggio di Test"));

    }
}
...