2013-06-27 56 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 ',因为它不需要。一般来说,你不要模拟正在测试的类。 –

相关问题