0

我正在尝试使用 JMockit 进行行为测试。在其中一个测试中,我需要在最终对象中调用一个方法。但是,最终对象未初始化(空对象),我不知道如何在测试中对其进行初始化(因为它被定义为最终对象)。我找不到在类中模拟最终实例的解决方案。先看测试,我会解释代码。

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 一直为空。

如果您需要更多信息,请告诉我,感谢您的帮助!

4

1 回答 1

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,所以它可能不起作用,但可能值得一试。

于 2013-06-27T17:20:34.797 回答