Java jUnit中Vertx.io内核与reactivex垂直应用的比较

Java jUnit中Vertx.io内核与reactivex垂直应用的比较,java,testing,junit,vert.x,Java,Testing,Junit,Vert.x,在我的项目中,大部分导入都依赖于io.vertx.reactivex.core.vertx包导入,有效地使整个项目使用reactivex(而不是core/vanilla)版本的vertx及其垂直项。我开始对我们的应用程序进行一点单元测试,为了使它能够很好地使用JUnit,根据以下设置,需要使用JUnit并在正确的线程和垂直上下文中运行测试用例: @RunWith(VertxUnitRunner.class) /* Set the runner */ public class DaoTest {

在我的项目中,大部分导入都依赖于
io.vertx.reactivex.core.vertx
包导入,有效地使整个项目使用
reactivex
(而不是
core
/vanilla)版本的vertx及其垂直项。我开始对我们的应用程序进行一点单元测试,为了使它能够很好地使用JUnit,根据以下设置,需要使用JUnit并在正确的线程和垂直上下文中运行测试用例:

@RunWith(VertxUnitRunner.class) /* Set the runner */
public class DaoTest {

    @Rule /* Define rule to get vertx instance in test */
    public RunTestOnContext rule = new RunTestOnContext();

   @Test
    public void exampleTest(TestContext context) {
       TestClass t = new TestClass(rule.vertx());
   }
}
TestClass
的定义如下:

import io.vertx.reactivex.core.Vertx; /* Mind here */
public class TestClass {

    public TestClass(Vertx vertx) {
        /* Something */
    }
我无法提供正确的
Vertx
实例,因为包
io.Vertx.ext.unit.junit
中只存在
RunTestOnContext
的一个定义,并生成
io.Vertx.core.Vertx
实例,该实例与
TestClass
正在使用的
io.Vertx.reactivex.core.Vertx
不兼容。其他一些测试实用程序,如TestContext,在
reactivex
io.vertx.reactivex.ext.unit.TestContext
中有它们的等价物,但是
RunTestOnContext
似乎不是这样


问题是如何在测试上下文中正确地获取io.vertx.reactivex.core.vertx实例,以确保线程和上下文的一致性?

项目的vertx单元只具有vertx core的深度。并且不依赖于vertx rx java。这是可以理解的。因此,
RunTestOnContext
是使用
io.vertx.core.vertx
构建的

您可以使用
vertx.getDelegate()
io.vertx.reactivex.core.vertx
向下转换到
io.vertx.core.vertx
。但这不会朝相反的方向起作用


因此,最好的选择是复制
RunTestOnContext
的代码,并创建它的reactivex版本。(最快的方法是将导入更改为
io.vertx.reactivex.core.vertx
,并在访问它的地方使用
vertx.getDelegate()

通过
RxVertx=vertx.vertx()获取RxVertx实例&通过
rxVertx.getDelegate()创建vertx实例。以下是完整的代码片段:

@RunWith(VertxUnitRunner.class)
公共类MyVerticleTest{
受保护的Vertx-Vertx;
@以前
公共无效设置(TestContext上下文){
rxVertx=Vertx.Vertx();
vertx=rxVertx.getDelegate();
Async Async=context.Async(1);
RxHelper.deployVerticle(rxVertx,新的MyVerticle())
.subscribe(res->async.countDown(),err->{
抛出新的运行时异常(err);
});
}
@试验
公共void my_测试(TestContext上下文){
Async Async=context.Async();
rxVertx.eventBus().rxSend(“地址”,dataToSend)
//.flatMap()
.订阅(接收数据->{
//坚持你想要的;
async.complete();
},上下文::失败);
}
@之后
公共void拆卸(TestContext上下文){
client.close();
关闭(context.asyncAssertSuccess());
}
}

说“这是可以理解的”,您的意思是提供rx版本的vertx装置没有意义,我们有一些设计缺陷?我认为在这种情况下,通过委托进行转换将是从正式的UML角度进行的向上转换??vertx的做法是,他们不为vertx rx单元提供额外的util包,而是尝试使用vertx util包中的@VertxGen注释自动生成代码存根。正如您所指出的,这适用于TestContext等。但对于RunOnContext类来说,这并不是(或不可能?)你们现在需要的。也许在vertx rx java中应该有一个来自它的实现,但这并不是它真正所属的包。是的,从普通的vertx转换到reactivex.vertx将是一个向上转换。嘿,我按照你的建议覆盖了必需的类,测试工作很好,感谢你的建议,同时我想到了一个黑客解决方案:你可以用
TestClass t=new TestClass(new io.vertx.reactivex.core.vertx(rule.vertx())替换你的行
也可以工作。主要问题是您的解决方案没有使用
@Rule public RunTestOnContext Rule=new RunTestOnContext(),有效地使异常和上下文断言在测试运行程序线程中不可访问。参见文档部分。例如,从intelliJ IDE运行的测试将全部通过(因为在运行线程中没有抛出异常)