java - 如何使用 JMockit 模拟类中的最终实例变量

标签 java mocking initialization final jmockit

我正在尝试使用 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.requestSimilarEntries之后将调用nc.nrh.sendRequest。

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。测试结果显示“缺少调用”。我检查了 Debug模式(在 Eclipse 中),并且 nc.nrh 始终为 null。

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

最佳答案

您正在模拟 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 了,所以它可能不起作用,但可能值得尝试。

关于java - 如何使用 JMockit 模拟类中的最终实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349105/

相关文章:

java - Android 将字符串转换为类

java - 使用链接队列出列方法错误无法将对象转换为类

php - 如何在 Symfony 3 中模拟 'find' 方法

node.js - 为什么似乎没有用于 Node 的任何强大的 HTTP 服务器模拟包? (或者有吗?)

Java 不明确的结果

java - 不能对 JpaSpecificationExecutor<T> 存储库使用 findAll(Specifications<T>, Pageable) 方法?

java - 将实体对象转换为 POJO 的最佳方式,反之亦然?

python - 如何使用模拟框架模拟 Tornado 协程函数进行单元测试?

swift - convenience init vs init in swift, explicit examples better 有什么区别

c++ - 从字符串文字初始化 char 数组是否被认为是隐式转换?