10

here で 説明されているように、@Repeat注釈は現在サポートされていません。スポックテストをn回繰り返しとしてマークするにはどうすればよいですか?

スポックテストがあるとします:

def "testing somthing"() {
    expect:
    assert myService.getResult(x) == y

    where:
    x | y
    5 | 7
    10 | 12
}

n回繰り返すようにマークするにはどうすればよいですか?

4

5 に答える 5

12

@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

}

これは現在、スポックでこれを行う唯一の方法です。

于 2012-06-06T07:48:55.113 に答える
1

上記の回答に示されているように、where ブロックを使用できます。現在、すでに where ブロックがあるメソッドを繰り返す方法はありません。

于 2012-06-06T11:54:14.680 に答える
0

私はここで実用的な解決策を見つけました(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();
        }
    }
}
于 2012-06-06T12:26:35.383 に答える
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;
}
于 2016-12-28T16:24:15.487 に答える
0

以下のコード スニペットを使用して、一連の値について Spock テストを繰り返します。

def "testing somthing"() {
    expect:
    assert myService.getResult(x) == y

    where:
    x >> [3,5,7]
    y >> [5,10,12]
}
于 2015-07-16T11:34:24.650 に答える