簡體   English   中英

嘗試最終阻止的單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM