当前位置: 首页 > 知识库问答 >
问题:

正确的测试模式在项目Reactor块()vs StepVerifier

夏谦
2023-03-14

最近,我注意到我的团队在如何在Reactor中编写测试方面遵循了两种方法。第一个方法是借助.block()方法。它看起来是这样的:

@Test
void set_entity_version() {
    Entity entity = entityRepo.findById(ID)
                              .block();
    assertNotNull(entity);
    assertFalse(entity.isV2());

    entityService.setV2(ID)
                 .block();

    Entity entity = entityRepo.findById(ID)
                              .block();

    assertNotNull(entity);
    assertTrue(entity.isV2());
}

第二部分是关于stepverifier的使用。它看起来是这样的:

@Test
void set_entity_version() {

    StepVerifier.create(entityRepo.findById(ID))
                .assertNext(entity -> {
                    assertNotNull(entity);
                    assertFalse(entity.isV2());
                })
                .verifyComplete();
            
    StepVerifier.create(entityService.setV2(ID)
                                     .then(entityRepo.findById(ID)))
                .assertNext(entity -> {
                    assertNotNull(entity);
                    assertTrue(entity.isV2());
                })
                .verifyComplete();
}

以我的拙见,第二种方法看起来更被动。此外,官方文件对此非常清楚:

不过,我还是很好奇,应该鼓励什么样的方式作为Reactor测试的主要途径。是否应该完全放弃.block()方法?若有,是甚么情况?

谢了!

共有1个答案

向苗宣
2023-03-14

你应该使用步进验证器。它允许更多的选择:

  • 验证流量中是否有n个元素
  • 验证流量/mono是否完成
  • 验证是否出现错误
  • 验证序列是否需要n个元素后接错误(无法用.block()进行测试)

来自官方文档:

public <T> Flux<T> appendBoomError(Flux<T> source) {
  return source.concatWith(Mono.error(new IllegalArgumentException("boom")));
}

@Test
public void testAppendBoomError() {
  Flux<String> source = Flux.just("thing1", "thing2"); 

  StepVerifier.create( 
    appendBoomError(source)) 
    .expectNext("thing1") 
    .expectNext("thing2")
    .expectErrorMessage("boom") 
    .verify(); 
}

    null
 类似资料:
  • 我想在Eclipse中的Java9模块化项目上使用JUnit5运行测试,而不使用Maven、Gradle或所有那些花哨的东西。因此,我有路径,其中module-info.java和模块的包所在,还有所有测试类所在。Id est业务照常,在拼图模块系统之前。我有Eclipse Oxygen.3a(4.7.3a)和Java 10.0.1。 我看过一些来自Eclipse的视频,展示了如何将JUnit测试

  • 我有一个多模块maven项目,包含三个模块、和 Core具有以下依赖项定义 我已经为所有三个模块添加了Java9定义,的如下所示: 但是,我不知道如何让的测试类能够在测试执行期间看到类。当尝试测试运行时,找不到类。 如果向的添加需要My.Project.TestUtils;的: 然后在编译时,我得到一个错误,即找不到模块(大概是因为它只是作为测试依赖项引入的)。 在Java9模块化的世界中,如何处

  • 我有一个类似这样的项目结构: -应用 --模块 2 //库模块 --模块3 //库模块 我正在为我的多模块Android项目编写仪器测试用例,其中包含jaco代码覆盖范围。如果我从“app”模块执行检测测试用例,则仅为“app”模块类生成代码覆盖率。 因此,为了获得“模块2”的代码覆盖率 当我在非应用程序模块中执行插装测试用例,无法启动主活动,插装期间应用程序未启动,测试用例失败时,会出现问题。

  • 我正在GitHub上创建一个模块化的构建(使用module-info.java),但是在我想要模块化的模块中添加一个module-info.java时,无法执行任何测试... 我怎样才能做到这一点呢? 我正在使用以下版本: junit.jupiter版本5.3.0(第一次使用版本5.2.0也不成功) maven-compiler-plugin版本3.8.0(第一次使用版本3.7.0也不成功) ma

  • 如何在导入到另一个模块的jar中包括测试目录(src/test/)下的Spring bean? 我有几个Maven项目: ms1、ms2、ms3和通用共享。通用共享是一个多模块的Maven项目。它包含几个模块:通用共享utills、通用共享fs等... 在每个子模块中,我都有一个专用的pom。xml以及所需的所有依赖项,在通用共享pom中,我有关于构建和模块的详细信息: 似乎我为子模块中的测试(位

  • 我试图在1.12.2上创建一个新的《我的世界》mod,并添加了一些基本的内容,一切都很顺利,除了自定义项目没有正确显示名称。我试图让红宝石项目进入游戏,但创意菜单显示为项目。Ruby.name。 我的错误是几乎相同的一个在这里:块纹理和块名称不加载minecraft锻造,我按照他们的建议,得到了一个lang文件,但它仍然不显示正确。我尝试了命名文件en_US. lang和en_us.lang,我尝