如何使用任何模拟框架模拟io.vertx.ext.jdbc.JDBCClient

时间:2018-03-16 17:57:47

标签: java vert.x vertx-httpclient vertx-verticle

我想模仿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;
    }
}

1 个答案:

答案 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。我还使用thenReturnMockito.when(asyncResultResultSet.result()).thenReturn(res1).thenReturn(res2) ...; 来运行我的垂直。