gpt4 book ai didi

multithreading - 使用并行流时,Spock 单元测试卡住

转载 作者:行者123 更新时间:2023-12-01 06:10:33 25 4
gpt4 key购买 nike

我在 Spock 单元测试中对 Java 8 并行流有一个奇怪的行为。

下面的代码需要一个列表 PlanConfigConstraintValidator并验证是否全部返回 true .

下面给出了 Spock 中这段代码的单元测试。一切正常,直到我添加 .parallel() .使用并行流时,单元测试卡住,永不停止。

如果我只返回一个 Mock(PlanConfigConstraintValidator) ,它有效,但当大小大于 1 时无效。

我也在底部提供了线程转储。

@Override
public boolean isValid(PlanConfig planConfig, ConstraintValidatorContext context) {
return getPlanConfigConstraintValidators().stream().parallel()
.filter(validator -> shouldValidate(planConfig, validator))
.allMatch(validator -> isValid(planConfig, context, validator));
}

这是单元测试代码
def "isValid - all validators return true"() {
when:
def validator = Spy(PlanConfigValidator) {
getPlanConfigConstraintValidators() >> [
Mock(PlanConfigConstraintValidator),
Mock(PlanConfigConstraintValidator),
]
shouldValidate(_, _) >> true
isValid(_, _, _) >> true
}
def result = validator.isValid(new PlanConfig(), Mock(ConstraintValidatorContext))

then:
result
}

线程转储
"main" #1 prio=5 os_prio=0 tid=0x00000000026aa000 nid=0x1dd78 in Object.wait() [0x00000000034ac000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076da712d8> (a java.util.stream.MatchOps$MatchTask)
at java.util.concurrent.ForkJoinTask.externalAwaitDone(ForkJoinTask.java:334)
- locked <0x000000076da712d8> (a java.util.stream.MatchOps$MatchTask)
at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:405)
at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:734)
at java.util.stream.MatchOps$MatchOp.evaluateParallel(MatchOps.java:242)
at java.util.stream.MatchOps$MatchOp.evaluateParallel(MatchOps.java:196)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454)

Thread Dump

最佳答案

我今天遇到了类似的问题,似乎该问题与 Spy 的实现有关。在斯波克。

使用 parallelStream()没有解决我的问题。

对我来说讨论here很有帮助。

我最终得到了一个匿名子类。使用我的解决方案,OP 的示例如下所示:

def "isValid - all validators return true"() {
when:
def validator = new PlanConfigValidator() {
@Override
List<PlanConfigConstraintValidator> getPlanConfigConstraintValidators() {
Arrays.asList(Mock(PlanConfigConstraintValidator),
Mock(PlanConfigConstraintValidator))
}

@Override
boolean shouldValidate(_,_) {
return true
}

@Override
boolean isValid(_,_,_) {
return true
}
}

def result = validator.isValid(new PlanConfig(), Mock(ConstraintValidatorContext))

then:
result
}

关于multithreading - 使用并行流时,Spock 单元测试卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com