try-finally块的单元测试

时间:2014-06-18 11:42:03

标签: java unit-testing switch-statement try-finally

我应该如何编写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是一个String数组。

主要问题是我应该如何测试case VALUE_3:

因为第一次测试index = 0,但之后index的值将更改为finally块中的其他内容,我想再次使用new {{ 1}}在同一单元测试类中的值。

2 个答案:

答案 0 :(得分:0)

您是否考虑为每个测试方法创建一个新的类实例(一个封装索引& getUrl)? 因此,每个测试方法都以index = 0 ...

重新开始

答案 1 :(得分:0)

对于测试,您必须能够将私有index变量的值设置为(例如):

  • 值为正且小于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