2009-12-01 37 views
2

我試圖使用jMockit將一個調用stub out到netscape.javascript.JSObject,這不幸是一個抽象類,其中有幾個本地方法,兩者都不能很好地發揮與jMockit。有沒有什麼方法可以讓我把它與jMockit一起存檔,或者使用普通的java(如果可能,我不想引入新的庫)?我試圖注入模擬的代碼看起來像下面這樣(不要問):如何使用jMockit模擬原生方法

JSObject win = JSObject.getWindow(this);
String someVal =(String)win.call(「foo」,new String [] {「」});

不幸的是,我不能修改有問題的代碼(再次,不要問),所以我可以做任何類型的單元測試的唯一方法是,如果我能弄清楚如何去掉或以其他方式消除對JSObject的呼叫。我目前的模擬實現返回本身調用getWindow一個新的實例,並呼叫一個常量字符串返回呼叫但當然在運行時失敗,抱怨

類重新定義失敗:嘗試改變方法修飾符

從我的研究中,我發現意味着它試圖嘲諷本地方法。

編輯:由於目標平臺我需要使用JDK 1.5來構建/測試,所以任何解決方案必須在1.5上可行。

回答

3

您正在使用哪個版本的JMockit?根據this,你應該能夠嘲笑本地方法,沒有任何問題。

@Test 
public void mockNativeMethod() { 
    new MockUp<Runtime>() { 
     @Mock 
     @SuppressWarnings("unused") 
     int availableProcessors() { 
      return 999; 
     } 
    }; 
    assertEquals(999, Runtime.getRuntime().availableProcessors()); 
} 

編輯:正如你所說,這不適用於Java 1.5。我擔心唯一的解決方案是用一個裝飾器來包裝你的本地對象,而這個裝飾器只是作爲傳遞操作。這有點令人頭疼,但它會允許嘲笑/攔截等。

+0

我正在使用最新版本,但問題是我被限制使用JDK 1.5,它不提供允許檢測模擬它們所需的本機方法的接口。 – Orclev 2009-12-01 20:13:22

1

正如Brian指出的那樣,JMockit支持模擬本地方法。 (期望API,在下面的測試中所示,也支持它。)

@Test // this only works under JDK 1.6+; JDK 1.5 does not support redefining natives 
public void mockNativeMethod() 
{ 
    new Expectations() 
    { 
     final System system = null; 

     { 
     System.nanoTime(); returns(0L); 
     } 
    }; 

    assertEquals(0, System.nanoTime()); 
} 

的問題,不過,是在JDK 1.5 JVMTI實現不是很成熟,不支持的native方法重新定義。

我知道您需要在JDK 1.5環境中部署生產代碼,但在開發環境中使用JDK 1.6應該不是障礙。通常,在JDK 1.6上運行測試應該是非常安全和容易的,甚至可以使用JDK 1.6編譯器編譯所有源代碼。您只需將javac「target」指定爲「1.5」即可。在Eclipse中,在「項目屬性 - > Java編譯器」下有一個「JDK合規性」配置。

相關問題