2013-06-27 83 views
0

我想用JMockit來做行爲測試。在其中一項測試中,我需要在最終對象中調用一個方法。然而,最終的對象沒有初始化(空對象),我不知道如何在測試中初始化它(因爲它是最終定義的)。我無法找到解決方案在課堂上嘲笑最終實例。先看看測試,我會解釋代碼。如何使用JMockit在類中模擬final實例變量

public class NetworkClientTest { 
    @Cascading @Capturing ServerRequestHandler nrh; 

    @Test 
    public void testRequestSimilar(){ 
     //define test parameters 
     String smiles = "abcd"; 
     float t = (float) 0.1; 
     final Map<String, Object> parameters = new HashMap<String, Object>(); 
     String smi = StringEscapeUtils.unescapeJava(smiles); 
     parameters.put("smiles",smi); 
     parameters.put("tanimoto", t); 
     //end define test parameters 
     //try to initialize NetworkClient object 
     new MockUp<NetworkClient>() { 
     @Mock 
     public void $init(){ 

     } 
     }; 
     NetworkClient nc = new NetworkClient(); 
     new Expectations(){ 
     //ServerRequestHandler nrh; 
     { 
      nrh.sendRequest("get_similar_entries", parameters); 
     } 

    }; 
    //when nc.requestSimilarEntries is called, nc.nrh.sendRequest will be expected. 
    nc.requestSimilarEntries(smiles, t); 
} 

其中NRH是在NC(NetworkClient類)和nc.nrh.sendRequest限定的最終實例nc.requestSimilarEntries被稱爲後會被調用。

public class NetworkClient { 
    private final ServerRequestHandler nrh = new ServerRequestHandler(); 
    ... 
    public void requestSimilarEntries(String smiles, float tanimoto) { 
    // Set up parameters 
    Map<String, Object> parameters = new HashMap<String, Object>(); 
    String smi = StringEscapeUtils.unescapeJava(smiles); 
    parameters.put("smiles",smi); 
    parameters.put("tanimoto", tanimoto); 

    // Send a request to the handler 
    nrh.sendRequest("get_similar_entries", parameters); 
} 

問題是我無法獲得測試中初始化的最終ServerRequestHandler nrh。測試結果顯示'缺少調用'。我檢查了調試模式(在Eclipse中),並且nc.nrh始終爲空。

請讓我知道你是否需要更多信息,並感謝你的幫助!

回答

2

你在嘲笑NetworkClient的構造函數,這也意味着實例變量沒有實例化。您需要實例化nrh變量。例如:

new MockUp<NetworkClient>() { 
    @Mock 
    public void $init(Invocation inv){ 
     NetworkClient client = inv.getInvokedInstance(); 
     Deencapsulation.setField(client, "nrh", new ServerRequestHandler()); 
    } 
    }; 

現在,你可能也想嘲笑ServerRequestHandler類,在這種情況下,你可以簡單地創建一個新的MockUp

new MockUp<NetworkClient>() { 
    }; 

    new MockUp<ServerRequestHandler>() { 
    }; 

注:我沒有在使用了一段時間jmockit所以它可能無法工作,但可能值得嘗試。

+0

是的,謝謝assylias!這完美地解決了這個問題。 – jgmao

+3

只需移除'MockUp ',因爲它不需要。一般來說,你不要模擬正在測試的類。 –

相關問題