2017-08-27 2 views
-2

Ich habe folgende Methode in meinem Dienst AWS sqsJava mit Mockito nicht

@Override 
public Message recieveMessage(String queueUrl) { 
    Objects.requireNonNull(queueUrl); 
    ReceiveMessageRequest request = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(1); 
    ReceiveMessageResult receiveMessageResult = this.sqsClient.receiveMessage(request); 
    // As per the spec, we need to return only one message. 
    return receiveMessageResult.getMessages().get(0); 
} 

@Override 
public int getMessageCount(String queueUrl) { 
    GetQueueAttributesResult queueAttributes = sqsClient.getQueueAttributes(queueUrl, Arrays.asList("ApproximateNumberOfMessages")); 
    return Integer.valueOf(queueAttributes.getAttributes().get("ApproximateNumberOfMessages")); 
} 

und folgenden sind meine Testfälle für diese Methoden zu verspotten Mockito Verwendung mit NPE versagen.

@Test 
public void testRecieveMessage() { 

    Message message = new Message(); 
    message.setBody("Message Body"); 

    List<Message> messages = new ArrayList<>(); 
    messages.add(message); 

    ReceiveMessageResult result = new ReceiveMessageResult(); 
    result.setMessages(messages); 

    when(mock(ReceiveMessageResult.class).getMessages()).thenReturn(messages); 
    when(mock(List.class).get(0)).thenReturn(message); 
    when(this.amazonSQSClient.receiveMessage(mock(ReceiveMessageRequest.class))).thenReturn(result); 

    this.amazonQueueService.recieveMessage(anyString()); 
    verify(this.amazonSQSClient, times(1)).receiveMessage(mock(ReceiveMessageRequest.class)); 
    //Assert.assertNotNull(msg); 
} 

java.lang.NullPointerException bei com.example.queue.service.impl.AmazonSQSService.recieveMessage (AmazonSQSService.java:46) bei com.example.AmazonSQSServiceTest.testRecieveMessage (AmazonSQSServiceTest.java:77) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) bei java.lang .reflect.Method.invoke (Methode.java:498) bei org.junit.runners.model.FrameworkMethod $ 1.runReflective Rufen Sie (FrameworkMethod.java:50) bei org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) bei org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) bei org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) bei org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) bei org.junit. runners.ParentRunner.runLeaf (ParentRunner.java:325) bei org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) bei org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) bei org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) bei org.junit.runners.ParentRunner $ 1. Zeitplan (ParentRunner.java:71) bei org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) bei org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) bei org.junit .runners.ParentRunner $ 2.Bewertung (ParentRunner.java:268) bei org.junit.runners.ParentRunner.run (ParentRunner.java:363) bei org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run (JUnit45AndHigherRunnerImpl.java: 37) bei org.mockito.runners.MockitoJUnitRunner.run (MockitoJUnitRunner.java:62) bei org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:86) bei org.eclipse. jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner .runTests (RemoteTestRunner.java:459) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:678) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:382) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:192)

@Test 
public void testMessageCount() { 
    GetQueueAttributesResult result = new GetQueueAttributesResult(); 
    result.addAttributesEntry("ApproximateNumberOfMessages", "10"); 
    List<String> attrs = Arrays.asList("ApproximateNumberOfMessages"); 
    when(this.amazonSQSClient.getQueueAttributes(anyString(), eq(attrs))).thenReturn(result); 
    this.amazonQueueService.getMessageCount(anyString()); 
} 

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Ungültiger Verwendung von Argument-Matcher! 2 Matcher erwartet, 1 aufgezeichnet: -> bei com.example.AmazonSQSServiceTest.testMessageCount (AmazonSQSServiceTest.java:96)

Diese Ausnahme kann auftreten, wenn Matcher mit Rohwerten kombiniert werden: // falsch: irgendeinemethode (anyObject(), "rohe Zeichenfolge"); Wenn Sie Matcher verwenden, müssen alle Argumente von Matching-Programmen bereitgestellt werden. Zum Beispiel: // richtig: someMethod (anyObject(), eq ("String by matcher"));

Für weitere Informationen siehe Javadoc für Matchers-Klasse.

at com.example.queue.service.impl.AmazonSQSService.getMessageCount(AmazonSQSService.java:58) 
at com.example.AmazonSQSServiceTest.testMessageCount(AmazonSQSServiceTest.java:96) 
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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Fehle ich etwas?

Antwort

2

Hier ist, was Ihr Code tut:

ReceiveMessageRequest request = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(1); 
ReceiveMessageResult receiveMessageResult = this.sqsClient.receiveMessage(request); 

So schafft er eine neue Anforderung und leitet ths neue Anfrage an sqsClient.receiveMessage().

Hier ist, wie man das testen:

when(this.amazonSQSClient.receiveMessage(mock(ReceiveMessageRequest.class))).thenReturn(result); 

Also Ihr Test sagt th Mock-Client result zurückzukehren, wenn receiveMessage() mit einem Mock ReceiveMessageRequest genannt wird.

Das kann also nicht funktionieren. Der Schein ReceiveMessageRequest entspricht nicht der neuen Anforderung, die im Code verwendet wird. Sie brauchen so etwas wie

when(this.amazonSQSClient.receiveMessage(any(ReceiveMessageRequest.class))).thenReturn(result); 

So, das zu tun, whetever die Anforderung an receiveMessage geben, das Mock-Client das Ergebnis zurückgibt.

In Bezug auf Ihre zweite Frage:

this.amazonQueueService.getMessageCount(anyString()); 

nicht sinnvoll ist. Sie müssen Ihre Methode mit einer echten gegebenen Zeichenfolge aufrufen.