我想模仿io.vertx.ext.jdbc.JDBCClient
对以下verticle
代码进行单元测试:
class A {
private final Helper help = new Helper();
public JsonObject checkEmailAvailability(String email, JDBCClient jdbc) throws SignUpException {
JsonObject result = new JsonObject();
jdbc.getConnection(conn -> help.startTx(conn.result(), beginTans -> {
JsonArray emailParams = null;
emailParams = new JsonArray().add(email);
System.out.println(email);
help.queryWithParams(conn.result(), SQL_SELECT_USER_EMAIL, emailParams, res -> {
if (res.getNumRows() >= 1) {
result.put("message", "Email already registered");
}
});
}));
return result;
}
}
答案 0 :(得分:0)
您可以使用Mockito
来模拟jdbc
行为。假设您想测试res
返回一行时Verticle的行为方式。
模拟你的jdbc
:
jdbc = Mockito.mock(JDBCClient.class);
然后你必须模拟一个ResultSet
对象:
ResultSet res = Mockito.mock(ResultSet.class);
Mockito.when(res.getNumRows()).thenReturn(1);
然后你必须嘲笑负责返回AsyncResult
的{{1}}对象:
res
然后你必须嘲笑负责返回AsyncResult<ResultSet> asyncResultResultSet = Mockito.mock(AsyncResult.class);
Mockito.when(asyncResultResultSet.succeeded()).thenReturn(true);
Mockito.when(asyncResultResultSet.result()).thenReturn(res);
的{{1}}对象。使用SQLConnection
获取处理程序并强制它返回模拟:
asyncResultResultSet
然后你必须嘲笑负责返回Answer
的{{1}}对象。同样,SQLConnection sqlConnection = Mockito.mock(SQLConnection.class);
Mockito.doAnswer(new Answer<AsyncResult<ResultSet>>() {
@Override
public AsyncResult<ResultSet> answer(InvocationOnMock arg0) throws Throwable {
((Handler<AsyncResult<ResultSet>>) arg0.getArgument(2)).handle(asyncResultResultSet);
return null;
}
}).when(sqlConnection).queryWithParams(Mockito.any(), Mockito.any(), Mockito.any());
有助于:
AsyncResult
你在这里。这是一堆代码,但您可以通过链接多个sqlConnection
来模拟多个Answer
对象并将其与AsyncResult<SQLConnection> sqlConnectionResult = Mockito.mock(AsyncResult.class);
Mockito.when(sqlConnectionResult.succeeded()).thenReturn(true);
Mockito.when(sqlConnectionResult.result()).thenReturn(sqlConnection);
Mockito.doAnswer(new Answer<AsyncResult<SQLConnection>>() {
@Override
public AsyncResult<SQLConnection> answer(InvocationOnMock arg0) throws Throwable {
((Handler<AsyncResult<SQLConnection>>) arg0.getArgument(0)).handle(sqlConnectionResult);
return null;
}
}).when(jdbc).getConnection(Mockito.any());
一起使用:
ResultSet
尽量不要测试asyncResultResultSet
。
如果你想找到依赖项,这是我的完整solution。我还使用thenReturn
和Mockito.when(asyncResultResultSet.result()).thenReturn(res1).thenReturn(res2) ...;
来运行我的垂直。