2014-05-03 115 views
0

我使用JUnit進行單元測試。我用JMockit在我的單元測試來模仿一些java.util類:JMockit掛在單元測試

new MockUp<PrintWriter>() { //HERE UNIT TESTS HANG ON 
     @SuppressWarnings("unused") 
     @Mock(invocations = 5) 
     public void print(String s) { 
      System.out.print(s); 
     } 

     @SuppressWarnings("unused") 
     @Mock(invocations = 1) 
     public void flush() {} 
    }; 

問題:我的單元測試只是掛在在樣機的定義。

問題:你可能會想到這個問題嗎?

我的依賴關係:

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.jmockit</groupId> 
     <artifactId>jmockit</artifactId> 
     <version>1.7</version> 
    </dependency> 
</dependencies> 
+0

同在這裏與Mac Os x。它嵌入在'MacosxVirtualMachine.read(int,byte [],int,int)行中:not available [native method]' – perencia

+0

@perencia so JMockit不能模擬調用本地函數的方法。我對嗎? –

+0

我不確定這是一個問題。 – perencia

回答

2

請,此網頁上有一看:

http://jmockit.googlecode.com/svn-history/r1123/trunk/www/installation.html

在步驟4

你可能缺少一個jmockit劑作爲默認VM參數:

-javaagent:<path_to>\jmockit.jar 
+0

謝謝。我使用jdk 1.7。幾小時後我會嘗試您的解決方案。 –

+0

我的榮幸。我也使用1.7,但沒有jmockit代理仍然有一些麻煩。我希望它能解決你的問題。 – Veronika

+0

注意:該頁面的當前版本位於http://jmockit.googlecode.com/svn/trunk/www/gettingStarted.html。 –

1

下面的測試類適用於我,使用JMockit 1.7。

@RunWith(JMockit.class) 
public class PrintWriterTest 
{ 
    @Test 
    public void useMockedPrintWriter() throws Exception { 
     new MockUp<PrintWriter>() { 
      @Mock(invocations = 5) void print(String s) { System.out.print(s); } 
      @Mock(invocations = 1) void flush() {} 
     }; 

     writeTextFileWithFiveLines(); 
    } 

    void writeTextFileWithFiveLines() throws Exception { 
     PrintWriter pw = new PrintWriter("temp.txt"); 
     pw.print("line1"); 
     pw.print("line2"); 
     pw.print("line3"); 
     pw.print("line4"); 
     pw.print("line5"); 
     pw.flush(); 
    } 

    @Test 
    public void useNonMockedPrintWriter() throws Exception { 
     writeTextFileWithFiveLines(); 
    } 
} 

注1:使用上述@RunWith(JMockit.class)不是必需的;它的優點僅在於它避免了需要將jmockit.jar放在類路徑的junit.jar之前,使其具有-javaagent:jmockit.jar作爲JVM初始化參數。

注2:以上使用的invocations = n約束完全是可選的。