MFI*_*san 5 multithreading unit-testing spock java-8
我在 Spock 单元测试中对 Java 8 并行流有一个奇怪的行为。
以下代码采用 的列表PlanConfigConstraintValidator
并验证是否全部返回true
。
下面给出了 Spock 中这段代码的单元测试。一切正常,直到我添加.parallel()
. 使用并行流时,单元测试卡住,永不停止。
如果我只返回 one 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));
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试代码
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
}
Run Code Online (Sandbox Code Playgroud)
线程转储
"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)
Run Code Online (Sandbox Code Playgroud)
小智 0
我刚刚遇到了类似的问题,并能够通过以下方式解决它:
private class NoParallelStreamsList implements List {
@Delegate
List delegateList
@Override
Stream parallelStream() {
delegateList.stream()
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在OP的示例中,他们将 getPlanConfigConstraintValidators 的模拟更改为如下所示:
getPlanConfigConstraintValidators() >> new NoParallelStreamsList(
delegateList: [
Mock(PlanConfigConstraintValidator),
Mock(PlanConfigConstraintValidator),
]
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1480 次 |
最近记录: |