在我的项目中,几乎所有导入都依赖于io.vertx.reactivex.core.Vertx
包的导入,有效地使整个项目使用Vertx及其顶点的reactivex
版本(而不是core
/ vanilla版本)。根据这个documentation,我开始对我们的应用程序进行单元测试,并使其与JUint很好地兼容,需要进行以下设置才能使用JUnit并在正确的线程和顶点上下文中运行测试用例:< / p>
@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
的正确实例,因为包RunTestOnContext
中仅存在io.vertx.ext.unit.junit
的一个定义并产生了io.vertx.core.Vertx
实例,该实例与{{ io.vertx.reactivex.core.Vertx
正在使用的1}}。其他一些测试实用程序(例如TestContext)在TestClass
程序包reactivex
中具有其等效项,但是io.vertx.reactivex.ext.unit.TestContext
似乎不是这种情况。
问题是如何在测试上下文中正确获取RunTestOnContext
实例以确保线程和上下文的一致性?
答案 0 :(得分:1)
vertx-unit 项目仅与 vertx-core 相关。并且不依赖于 vertx-rx-java 。这是可以理解的。因此,如您所见,RunTestOnContext
是使用io.vertx.core.Vertx
构建的。
您可以将vertx.getDelegate()
从io.vertx.reactivex.core.Vertx
下调到io.vertx.core.Vertx
。 Bu不能在相反的方向上工作。
因此,最好的选择是复制RunTestOnContext
的代码并为其创建反应式版本。 (最快的方法是将导入更改为io.vertx.reactivex.core.Vertx
,并在访问它的地方使用vertx.getDelegate()
。)
答案 1 :(得分:0)
通过rxVertx = Vertx.vertx();
获取RxVertx实例,并通过rxVertx.getDelegate();
获取vertx实例。这是完整的代码段:
@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());
}
}