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: