[英]Vertx.io core vs reactivex verticle usage in jUnit
在我的项目中,大部分导入都在io.vertx.reactivex.core.Vertx
包导入上进行,有效地使整个项目使用reactivex
(不是core
/vanilla)版本的 Vertx 及其顶点。 我开始对我们的应用程序进行一些单元测试,并这样做并使其与 JUint 很好地配合使用,根据此文档,需要进行以下设置才能使用 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.ext.unit.junit
一个定义并生成io.vertx.core.Vertx
实例,该实例与io.vertx.reactivex.core.Vertx
不兼容TestClass
正在使用的io.vertx.reactivex.core.Vertx
。 其他一些测试实用程序,如具有的TestContext它们的等同于reactivex
包io.vertx.reactivex.ext.unit.TestContext
,但这似乎不适合的情况下RunTestOnContext
。
问题是如何在测试上下文中正确获取io.vertx.reactivex.core.Vertx
实例以仍然确保线程和上下文一致性?
vertx-unit项目只依赖于vertx-core 。 并且不依赖于vertx-rx-java 。 这是可以理解的。 因此, RunTestOnContext
使用内置io.vertx.core.Vertx
正如你看到的。
您可以使用vertx.getDelegate()
从io.vertx.reactivex.core.Vertx
向下转换为io.vertx.core.Vertx
。 但这在相反的方向上不起作用。
因此,您最好的选择是复制RunTestOnContext
的代码并创建它的RunTestOnContext
版本。 (最快的方法是将导入更改为io.vertx.reactivex.core.Vertx
并使用访问它的vertx.getDelegate()
。)
通过rxVertx = Vertx.vertx();
获取 RxVertx 实例rxVertx = Vertx.vertx();
& vertx 实例由rxVertx.getDelegate();
. 这是一个完整的代码片段:
@RunWith(VertxUnitRunner.class)
public class MyVerticleTest {
protected Vertx vertx;
@Before
public void setUp(TestContext context) {
rxVertx = Vertx.vertx();
vertx = rxVertx.getDelegate();
Async async = context.async(1);
RxHelper.deployVerticle(rxVertx, new MyVerticle())
.subscribe(res -> async.countDown(), err -> {
throw new RuntimeException(err);
});
}
@Test
public void my_test(TestContext context) {
Async async = context.async();
rxVertx.eventBus().rxSend("address", dataToSend)
// .flatMap()
.subscribe(receivedData -> {
// assert what you want;
async.complete();
}, context::fail);
}
@After
public void tearDown(TestContext context) {
client.close();
rxVertx.close(context.asyncAssertSuccess());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.