0

getUrlメソッドのテストはどのように記述すればよいですか?

public class UrlList {
    private final String[] urls;
    private int index;
    private SecureRandom random;

    public static enum Mode {
        VALUE_1,
        VALUE_2,
        VALUE_3;
    }

    public UrlList(String... urls) {
        if (urls == null || urls.length == 0) {
            throw new IllegalArgumentException("The url list may bot be null or empty!");
        }
        this.urls = urls;
        this.index = 0;
        this.random = new SecureRandom();
    }

    public String getUrl(Mode mode) {
        switch (mode) {
        case VALUE_1:
            return urls[0];
        case VALUE_2:
            return urls[random.nextInt(urls.length)];
        case VALUE_3:
            try {
                return urls[index];
            } finally {
                index = (index + 1) % urls.length;
            }
        default:
            throw new RuntimeException("Unknown mode!");
        }
    }
}

上記のコードurlsは文字列の配列です。

主な質問は、どのようにテストすればよいcase VALUE_3:ですか?

初めてテストするindex = 0が、その後の値はブロックindex内の別のものに変更されるため、同じユニットテストクラスのfinally新しい値で再度テストしたい.index

4

2 に答える 2

0

テストメソッドごとに、クラスの新しいインスタンス (インデックスと getUrl をカプセル化するもの) を作成することを検討していますか? したがって、各テストメソッドは index=0 で新たに開始されます ...

于 2014-06-18T12:11:03.177 に答える
0

indexテストでは、プライベート変数の値を (eg)に設定できる必要があります。

  • urls.length正の値で、制御するよりも小さい値を取得しますindex+1
  • url.length -1制御するには 0 を取得します
  • 許容値を取得するための誤った値 (負またはそれ以上urls.length) (例外からの回復後)

もちろん、インデックスはプライベートですが、リフレクションを通じてアクセスできます

urlList = new UrlList(...); // in test initialization
...
Field index = UrlList.class.getDeclaredField("index");
index.setAccessible(true);
index.setInt(urlList, i); // to set index
i = index.getInt(urlList); // to get index
于 2014-06-18T12:56:23.543 に答える