0

I am trying to create JUnit test for this code:

public class S3Connection {

private final Logger logger;
private final S3AsyncClient client;
private final String path;
private final String bucketName;


public S3Connection(Logger logger, S3AsyncClient client, String path, String bucketName) {
    this.logger = logger;
    this.client = client;
    this.path = path;
    this.bucketName = bucketName;
}

public Future<String> sendAsync(JsonNode event) throws S3Exception{
    JsonNode attributes = event.findValue("attributes");
    String content = getAttribute(attributes , "content");
    if(content == null){
        logger.error("HTML content does not exist in the event");
        return null;
    }
    int contentLength;
    AsyncRequestBody asyncRequestBody;
    contentLength = content.length();
    asyncRequestBody = AsyncRequestBody.fromString(content);

    logger.info("uploading file={} to bucket={}",  path, bucketName);

    PutObjectRequest putObjRequest = PutObjectRequest.builder()
            .bucket(bucketName)
            .key(path)
            .contentLength((long) contentLength).build();

    CompletableFuture<String> response = client.putObject(putObjRequest, asyncRequestBody).thenApply(
            getPutObjectResponse -> {
                logger.info("Got response from S3 upload={}", getPutObjectResponse.eTag());
                return getPutObjectResponse.eTag();
            });
    response.exceptionally(throwable -> {
        logger.error("Exception occurred while uploading file={}",path);
        try {
            throw new Exception(throwable.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    });
    return response;
}

private String getAttribute(JsonNode node, String k){
    String v = null;
    if(node.has(k)){
        v =  node.findValue(k).asText();
    }
    return v;
}

here my test:

class S3ConnectionTest {
  
  @Mock
  S3AsyncClient client;
  S3Connection s3Connection;
  String topic = "test-topic";
  ObjectMapper mapper;
  JsonNode json;
  @Mock
  Logger logger;
  AuditEventJsonMapper jsonMapper;
  private String event = "{\"attributes\":{\"contentType\":\"text\" , \"content\": \"html content\"},\"flowDescriptor\":\"CONNECTION_TO_REMOTE\" ,\"providerId\": \"provider\"}";
  PutObjectRequest putObjRequest;
  AsyncRequestBody asyncRequestBody;
  @BeforeEach
  public void setup() throws JsonProcessingException {
    ExecutorService executor = new ThreadPoolExecutor(1, 1, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue(100), (new ThreadFactoryBuilder()).threadNamePrefix("html-audit").build());
    S3Configuration configuration = new S3Configuration("","anyString()","us-west-2","XX","XX","dev",executor);
    client = mock(S3AsyncClient.class);
    mapper = new ObjectMapper();
    json = mapper.readTree(event);
    MockProducer<String, String> mock =
            new MockProducer<>(true, new StringSerializer(), new StringSerializer());
    connection = new KafkaConnection(topic, mock, logger);
    s3Connection = new S3Connection(logger , client , "path" , "bucket" ,null, connection);
    putObjRequest = PutObjectRequest.builder()
            .bucket("bucket")
            .key("path")
            .contentLength((long) 10).build();
    asyncRequestBody = AsyncRequestBody.fromString("encryptedContent");
  }
  

  @Test
  public void shouldSendAuditToS3AndProducer(){


    when(client.putObject(putObjRequest , asyncRequestBody)).thenReturn(any(CompletableFuture.class));
    Future<String> record = s3Connection.sendAsync(json);

  }
}

and got this error:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 3 matchers expected, 1 recorded: -> at com.intuit.idx.wiauditor.s3.S3ConnectionTest.shouldSendAuditToS3AndProducer(S3ConnectionTest.java:90)

This exception may occur if matchers are combined with raw values: //incorrect: someMethod(any(), "raw String"); When using matchers, all arguments have to be provided by matchers. For example: //correct: someMethod(any(), eq("String by matcher"));

For more info see javadoc for Matchers class.

at com.intuit.idx.wiauditor.s3.S3Connection.sendAsync(S3Connection.java:55)
at com.intuit.idx.wiauditor.s3.S3ConnectionTest.shouldSendAuditToS3AndProducer(S3ConnectionTest.java:91)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
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:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
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:143)
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:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
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:143)
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:129)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
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.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
HariHaravelan
  • 1,041
  • 1
  • 10
  • 19
BillalT
  • 23
  • 6
  • Does this answer your question? [Mockito: InvalidUseOfMatchersException](https://stackoverflow.com/questions/14845690/mockito-invaliduseofmatchersexception) – HariHaravelan Apr 12 '22 at 11:02

1 Answers1

0

the issue resolved by:

when(client.putObject(any(PutObjectRequest.class) , any(AsyncRequestBody.class))).thenReturn(new CompletableFuture<>());
BillalT
  • 23
  • 6
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Cristik Apr 13 '22 at 13:24