0

I am running a unit test using PowerMockito to perform a query using Vert.x's CassandraClient and I see ClassCastException.

Similar code works when performing updates.

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(VertxUnitRunner.class)
@PowerMockIgnore("javax.management.*")
@PrepareForTest({ CassandraClient.class, ResultSet.class, Row.class })
class TestCassandraClient {
    @Mock
    private AsyncResult<List<Row>> asyncListRow;

    @Mock
    private List<Row> listRow;


    @Test
    public void testQueryKeyspaces(TestContext context) {

    Mockito.when(asyncListRow.succeeded()).thenReturn(true);

    Mockito.when(asyncListRow.result()).thenReturn(listRow);

    Mockito.when(listRow.size()).thenReturn(0);

    Mockito.doAnswer(new Answer<AsyncResult<List<Row>>>() {

                @SuppressWarnings("unchecked")
            @Override
            public AsyncResult<List<Row>> answer(InvocationOnMock invocation) throws Throwable {

                    ((Handler<AsyncResult<List<Row>>>) invocation.getArgument(1)).handle(asyncListRow);

                    return asyncListRow;
                }

            }).when(client).executeWithFullFetch(Mockito.anyString(), Mockito.any());


    Async async = context.async(1);

    try {
        (new Operation()).queryAll(client, "SELECT * FROM system_schema.keyspaces")
        .setHandler(ar -> {

            if (ar.succeeded()) {

                async.complete();
            } else {
                context.fail("Failed to perform operation");

            }

            });


    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        context.verify(v -> {
                    Assert.fail(e.getMessage());
                });
        async.complete();
    }
    }
}

The method "queryAll" is as below:

Class Operation {
    public Future<OperationResult> queryAll(@NonNull final CassandraClient client, @NonNull final String query) {

    Objects.requireNonNull(client, "CassandraClient cannot be null");
    Objects.requireNonNull(query, "Update query cannot be null");

    Future<OperationResult> future = Future.future();

    try {


        client.executeWithFullFetch(query, rh -> {


            OperationResult resultObj = new OperationResult();

            if (rh.succeeded()) {

            resultObj.setSuccess(true);


            List<Row> rows = rh.result();


            if (rows != null && rows.size() > 0) {

                Row row = rows.get(0);

                ColumnDefinitions colDefs = row.getColumnDefinitions();

                resultObj.setColumnDefinitions(toJsonArray(colDefs));

            }

            resultObj.setData(toJsonArray(rows));


            } else {
            resultObj.setSuccess(false);

            resultObj.setException(rh.cause().getMessage());
            }

            future.complete(resultObj);
        });

    } catch (Exception e) {

            String msg = String.format("Problem invoking query: %s. Error: %s", query, e.getMessage());

        LOGGER.error(msg, e);

        OperationResult resultObj = new OperationResult();

        resultObj.setSuccess(false);

        resultObj.setException(msg);

        future.complete(resultObj);

    }

    return future;
    }
}

Note that I have added a mock instruction to return zero rows

Mockito.when(listRow.size()).thenReturn(0);

So, In the first line you see the response is returning a list of zero rows, but next I see an error as below.

05:21:41.015 [vert.x-eventloop-thread-0] DEBUG c.b.t.p.c.api.beans.OperationResult - JSON representation: {"column-definitions":null,"rows":[],"success":true,"exception":null}

05:21:41.015 [vert.x-eventloop-thread-0] ERROR c.b.t.p.c.api.operation.Operation - Problem invoking query: SELECT * FROM system_schema.keyspaces. Error: io.vertx.core.AsyncResult$MockitoMock$1728182793 cannot be cast to io.vertx.cassandra.CassandraClient java.lang.ClassCastException: io.vertx.core.AsyncResult$MockitoMock$1728182793 cannot be cast to io.vertx.cassandra.CassandraClient at io.vertx.cassandra.CassandraClient$MockitoMock$873315432.executeWithFullFetch(Unknown Source) at com.bmc.tso.persistence.client.api.operation.Operation.queryAll(Operation.java:195) at com.bmc.tso.persistence.client.api.operation.KeyspaceOperationUnitTest.testQueryKeyspaces(KeyspaceOperationUnitTest.java:372) 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 io.vertx.ext.unit.junit.VertxUnitRunner.invokeTestMethod(VertxUnitRunner.java:95) at io.vertx.ext.unit.junit.VertxUnitRunner.lambda$invokeExplosively$0(VertxUnitRunner.java:114) at io.vertx.ext.unit.impl.TestContextImpl.run(TestContextImpl.java:90) at io.vertx.ext.unit.junit.VertxUnitRunner.lambda$invokeExplosively$1(VertxUnitRunner.java:127) at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:320) at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) 05:21:

0 Answers0