[英]Unit test for try-finally block
我應該如何為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
塊中更改為其他值,因此我想使用同一單元測試類中的新index
值再次對其進行測試。
您是否考慮為每種測試方法創建類的新實例(一個封裝索引和getUrl)? 因此,每種測試方法均從index = 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.