簡體   English   中英

如何檢查使用JMockit傳遞的特定模擬實例?

[英]How can I check a specific mocked instance is passed using JMockit?

我想測試以下代碼

BufferedReader reader = new BufferedReader(new FileReader(args[0]));

如果我寫這樣的測試,那就行得通

@Mocked FileReader fileReader;
@Mocked BufferedReader bufferedReader;

//...

new NonStrictExpectations() {{
  new FileReader("filename"); times = 1;
  new BufferedReader(withAny(fileReader)); times = 1;
}};

然而,本次測試沒有請確保創建的FileReader傳遞到BufferedReader類的構造函數,只有一個的FileReader被傳遞。

我真正想要的是最后一行

new BufferedReader(withSameInstance(fileReader)); times = 1;

不幸的是,這是行不通的,因為JMockit抱怨BufferedReader的ctor從來沒有使用指定的參數來調用...

我嘗試在fileReader上使用@Captured,但是那也不起作用...

為了簡化API,在JMockit 1.6中刪除了@Capturing模擬字段獲取分配給它們的new -ed實例的功能。

使用當前的API(JMockit 1.6和1.7),您仍然可以通過以下兩種方式之一實現所需的效果:

@Mocked FileReader fileReader;
@Mocked BufferedReader bufferedReader;
FileReader capturedReader;

@Test
public void mockIOClasses() throws Exception {
    new NonStrictExpectations() {{
        new FileReader("filename");
        result = new Delegate() {
            void captureIt(Invocation inv) {
                capturedReader = inv.getInvokedInstance();
            }
        };
        times = 1;

        new BufferedReader(with(new Delegate<Reader>() {
            void check(Reader in) { assertSame(capturedReader, in); }
        }));
        times = 1;
    }};

    new BufferedReader(new FileReader("filename"));
}

@Test
public void mockIOClasses2() throws Exception
{
    new NonStrictExpectations() {{
        new FileReader("filename");
        result = new Delegate() {
            void captureIt(Invocation inv) {
                capturedReader = inv.getInvokedInstance();
            }
        };
    }};

    new BufferedReader(new FileReader("filename"));

    new Verifications() {{
        FileReader r;
        new BufferedReader(r = withCapture());
        assertSame(capturedReader, r);
    }};
}

這就是說,但是,我建議避免模擬JRE IO類。 上面的兩個測試都與實現細節緊密聯系在一起。 最好的方法是只使用一個真實的文件。 您應該可以在此處使用一個小的測試文件(在“ test”源目錄中),也許可以在測試本身中將其創建為臨時文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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