我应该如何编写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}}在同一单元测试类中的值。
答案 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