正如所描述的here @Repeat
注释目前不受支持。我怎样才能将spock测试标记为重复n次?
假设我有spock测试:
def "testing somthing"() {
expect:
assert myService.getResult(x) == y
where:
x | y
5 | 7
10 | 12
}
如何将其标记为重复n次?
答案 0 :(得分:5)
您可以使用@Unroll
这样的注释:
@Unroll("test repeated #i time")
def "test repeated"() {
expect:
println i
where:
i << (1..10)
}
它将为您创建10个单独的测试。
编辑完问题后编辑,使用最简单的方法实现此目的:
def "testing somthing"() {
expect:
assert myService.getResult(x) == y
where:
x | y
5 | 7
5 | 7
5 | 7
5 | 7
5 | 7
10 | 12
10 | 12
10 | 12
10 | 12
10 | 12
}
目前这只是在spock中执行此操作的方法。
答案 1 :(得分:1)
您可以使用上面的答案中显示的where-block。目前无法重复已有where-block的方法。
答案 2 :(得分:1)
使用以下代码剪切来迭代spock测试以获取值集
def "testing somthing"() {
expect:
assert myService.getResult(x) == y
where:
x >> [3,5,7]
y >> [5,10,12]
}
答案 3 :(得分:0)
我找到了工作解决方案here (ru)
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.ElementType
import java.lang.annotation.Target
import org.spockframework.runtime.extension.ExtensionAnnotation
import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension
import org.spockframework.runtime.model.FeatureInfo
import org.spockframework.runtime.extension.AbstractMethodInterceptor
import org.spockframework.runtime.extension.IMethodInvocation
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.METHOD, ElementType.TYPE])
@ExtensionAnnotation(RepeatExtension.class)
public @interface Repeat {
int value() default 1;
}
public class RepeatExtension extends AbstractAnnotationDrivenExtension<Repeat> {
@Override
public void visitFeatureAnnotation(Repeat annotation, FeatureInfo feature) {
feature.addInterceptor(new RepeatInterceptor(annotation.value()));
}
}
private class RepeatInterceptor extends AbstractMethodInterceptor{
private final int count;
public RepeatInterceptor(int count) {
this.count = count;
}
@Override
public void interceptFeatureExecution(IMethodInvocation invocation) throws Throwable {
for (int i = 0; i < count; i++) {
invocation.proceed();
}
}
}
答案 4 :(得分:0)
我发现了一种简单的黑客攻击方式。 Spock允许您将方法的返回值传递给where子句中定义的变量,因此使用此方法可以定义一个简单地循环遍历数据的方法,然后返回组合列表。
def "testing somthing"() {
expect:
assert myService.getResult(x) == y
where:
[x,y] << getMap()
}
public ArrayList<Integer[]> getMap(){
ArrayList<Integer[]> toReturn = new ArrayList<Integer[]>();
for(int i = 0; i < 5; i ++){
toReturn.add({5, 7})
toReturn.add({10, 12})
}
return toReturn;
}