我们使用Project Reactor按照下面ServiceTest
中的代码异步运行特定操作。为了测试这段代码,按照下面的ServiceTest
,在为异步操作设置Mono时,我们使用doonnext
将Mono的结果传递给DirectProcessor,然后使用stepVerifier执行测试调用和断言。
stepverifier#assertNext的JavaDoc读取
使用者抛出的任何AssertionErrors都将在验证期间重新抛出。
是否可以,如果可以,如何使用单个调度程序,并在验证过程中根据Javadoc重新抛出AssertionErrors?
@Service
@RequiredArgsConstructor
public class Service implements WithReactive, WithTestProcessor<Response> {
@Getter
@Setter
private DirectProcessor<Response> processor = DirectProcessor.create();
@Setter
private Scheduler scheduler = Schedulers.single();
public void doAction() {
Mono.fromSupplier(this::doActionAsync)
.doOnNext(processor::onNext)
.subscribeOn(scheduler)
.subscribe();
}
private Response doActionAsync() {
...
}
...
}
public interface WithReactive {
void setScheduler(Scheduler scheduler);
}
public interface WithTestProcessor<T> {
void setProcessor(DirectProcessor<T> processor);
DirectProcessor<T> getProcessor();
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceTest {
@Inject
private Collection<WithTestProcessor> withTestProcessors;
@Before
public void setTestProcessors() {
withTestProcessors.forEach(withTestProcessor -> withTestProcessor.setProcessor(DirectProcessor.create()));
}
@Inject
private Collection<WithReactive> withReactives;
@Before
public void makeReactiveSynchronous() {
withReactives.forEach(withReactive -> withReactive.setScheduler(Schedulers.immediate()));
}
@Test
private void test() {
StepVerifier.create(service.getProcessor())
.then(service::doAction)
.assertNext(response -> assertThat(logExtractor.getInsertsByTable("assets")).hasSize(1))
.thenCancel()
.verify();
}
}
这是三个因素的结合:最初的然后
,订阅与验证同时发生的事实,由于subscribeon
,以及thencancel
。
一种解决方法是,在StepVerifier执行thencancel
之前,给thenawait(Duration.ofMillis(10))
足够的时间让onnext
发生,方法是在thencancel
之前放一个thenawait(duration.ofMillis(10))
。
下面是在数据库中检查重名的代码 下面是测试validateDuplicateName方法的测试脚本 但是测试失败,出现以下错误 我能找人帮忙吗?
我的验证器类 当我没有选择任何选项就提交表单时, 无法将类型java.lang.String的属性值转换为属性类别所需的类型com.main.java.category;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性类别所需的类型[com.main.java.category]:找不到匹配的编辑器或转换策略 这
问题内容: 在为Java API编写单元测试时,可能需要在某些情况下执行更详细的异常验证。即比JUnit 提供的 @test 注释所提供的更多。 例如,考虑一个应该从其他接口捕获异常的类,包装该异常并抛出该包装的异常。您可能要验证: 引发包装异常的确切方法调用。 包装异常具有原始异常为其原因。 包装器异常的消息。 这里的要点是希望在单元测试中对异常进行额外的验证(而不是关于是否 应该 验证异常消息
问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常:
我明白验证在应用程序的几个层中都是必需的。但是,如果要在所有层中实施的验证都是相同的(大多数情况下都是这样),那么使用一个公共的验证框架是有意义的。这是Hibernate验证器的目标之一。 那么,哪条路走得更好呢?
我正在使用测试值: 我现在想做的是测试Mono中是否缺少一个项目。这样地: 我想测试单声道实际上是空的。我该怎么做呢?