2014-04-04 73 views
2

我想如果我寫一個測試這樣測試以下代碼如何檢查使用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,只有a FileReader獲得通過。

什麼其實我要的是最後一行是

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

不幸的是,這並不工作,因爲JMockit抱怨的BufferedReader的構造函數永遠不會調用指定的參數...

我試圖在文件讀取器上使用@Captured,但這也沒有奏效......

回答

4

模擬字段得到的new -ed實例分配給它們的能力在JMockit 1.6中被刪除,試圖模擬調整API。

隨着目前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類。上面的兩個測試都與實現細節緊密耦合。最好的方法是隻使用一個真實的文件;你應該可以在這裏使用一個小的測試文件(在「測試」源代碼目錄中),也許在測試中將它創建爲一個臨時文件。

+0

在文檔中對構造函數所描述的期望是什麼? – beluchin

+0

@beluchin在[教程](http://jmockit.googlecode.com/svn/trunk/www/tutorial/BehaviorBasedTesting.html#delegates)中的「代表」一節中。但是它沒有提到'Invocation'參數,目前只在本教程的另一章和API文檔中進行了描述。 –

+0

+1提及測試它與實現細節耦合太多並且建議使用小測試文件。 – beluchin