下面是我写的代码。我想用powermokito为db类写测试用例。
我希望使用junit powermokito为下面的vertx相关类编写测试用例,以覆盖80%的覆盖率。我尝试了不同的方法来模拟数据库,它在这里不起作用。我怎么写测试用例下面的代码?下面的代码包括db verticle和http server verticle。
public class EmployeeDBVerticle extends AbstractVerticle {
private JDBCPool jdbcpool;
@Override
public void start() throws Exception {
JsonObject jsonObject = new JsonObject();
jsonObject.put("url", "jdbc:mysql://localhost:3306/employee");
jsonObject.put("driver_class", "com.mysql.cj.jdbc.Driver");
jsonObject.put("max_pool_size", 30);
jsonObject.put("user", "root");
jsonObject.put("password","root");
jdbcpool = JDBCPool.pool(vertx,jsonObject);
vertx.eventBus().consumer(EventBusAddresses.ADDRESS_SAVE, message -> {
JsonObject student = (JsonObject) message.body();
saveStudent(student)
.onSuccess(success->{
message.reply(success);
}).onFailure(throwable -> {
message.fail(HttpResponseStatus.INTERNAL_SERVER_ERROR.code(), "Error while saving");
});
});
}
public Future<String> saveStudent(JsonObject student){
Promise<String> promise = Promise.promise();
String id = student.getString("id");
String name = student.getString("name");
jdbcpool.preparedQuery(SQLConstants.INSERT_EMPLOYEE)
.execute(Tuple.of(id,name))
.onFailure(throwable -> {
promise.fail("Failed");
}).onSuccess(rows -> {
if(rows.rowCount()>0){
promise.complete("Data Saved Successfully");
}else{
promise.fail("Error occurred");
}
});
return promise.future();
}
}
public class EmployeeHttpVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
Router router = Router.router(vertx);
router.route().handler(BodyHandler.create());
router.route(HttpMethod.POST,"/save/employee").handler(this::saveStudent);
vertx.createHttpServer().requestHandler(router).listen(8090);
}
private void saveStudent(RoutingContext routingContext) {
JsonObject student = routingContext.getBodyAsJson();
vertx.eventBus().request(EventBusAddresses.ADDRESS_SAVE,student, reply->{
if(reply.succeeded()){
System.out.println(reply.result().body());
routingContext.response().end((String) reply.result().body());
callThirdParty(student);
}else{
routingContext.response().end(reply.cause().getMessage());
}
});
}
public void callThirdParty(JsonObject student){
vertx.eventBus().request(EventBusAddresses.ADDRESS_SAVE,student);
}
}
1条答案
按热度按时间hfyxw5xn1#
我建议你重构这段代码。
你把所有的数据访问代码都嵌入了Vertx没有Vertx就无法测试它。耦合不是一个好主意。
一个更好的想法是从存储库的接口开始,并将其实现为Plain Old Java Object(POJO),而不引用Vertx。
您可以通过这种方式在没有Vertx的情况下测试POJO存储库。
一旦它运行完美,你可以给予Vertx控制器一个示例,让它通过POJO与数据库交互。
这个想法叫做依赖注入。像Sping Boot 这样的框架可以让你轻松做到这一点,但也可以不使用框架。示例化存储库POJO的一个示例,并在其构造函数中将其提供给Vertx控制器。存储库POJO现在是Vertx控制器中的私有数据成员。
如果您决定从Vertx切换到AWS lambda,您的POJO存储库不必更改。你可以将它注入到lambda中而不做任何改变。