![](/img/trans.png)
[英]how do i mock the a static method that provides an instance of the class being mocked with 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.