java 如何使用vertx为db类编写测试用例?

gzjq41n4  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(146)

下面是我写的代码。我想用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);
  }
}
hfyxw5xn

hfyxw5xn1#

我建议你重构这段代码。
你把所有的数据访问代码都嵌入了Vertx没有Vertx就无法测试它。耦合不是一个好主意。
一个更好的想法是从存储库的接口开始,并将其实现为Plain Old Java Object(POJO),而不引用Vertx。
您可以通过这种方式在没有Vertx的情况下测试POJO存储库。
一旦它运行完美,你可以给予Vertx控制器一个示例,让它通过POJO与数据库交互。
这个想法叫做依赖注入。像Sping Boot 这样的框架可以让你轻松做到这一点,但也可以不使用框架。示例化存储库POJO的一个示例,并在其构造函数中将其提供给Vertx控制器。存储库POJO现在是Vertx控制器中的私有数据成员。
如果您决定从Vertx切换到AWS lambda,您的POJO存储库不必更改。你可以将它注入到lambda中而不做任何改变。

相关问题