【问题标题】:is it possible to mock transient fields in tests?是否可以在测试中模拟瞬态场?
【发布时间】:2011-11-22 12:38:55
【问题描述】:

我有一个包含瞬态字段的类。但是该类的另一部分是可序列化的。 在测试中,我模拟了字段和类,并在深拷贝函数中使用了模拟的类对象,如下所示:

try {
      final ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
      objectOut = new ObjectOutputStream(bytesOut);
      // serialize and pass the object
      objectOut.writeObject(original);
      objectOut.flush();
      final ByteArrayInputStream bytesIn =
          new ByteArrayInputStream(bytesOut.toByteArray());
      objectIn = new ObjectInputStream(bytesIn);
      @SuppressWarnings("unchecked")
      final T clone = (T) objectIn.readObject();
      // return the new object
      return clone;
    }
catch () {...}

writeObject(original) 方法应该写入所有非瞬态和非静态字段。但是我有一个错误,说模拟瞬态字段的 java.io.NotSerializableException 。我想知道在测试中是否无法识别瞬态场?我使用 mockito 作为我的框架。

【问题讨论】:

    标签: testing mockito serializable transient


    【解决方案1】:

    “我嘲笑这个领域和班级”是什么意思?

    我刚刚基于这个虚拟类做了一个快速测试:

    public class DummyClass implements Serializable {
        private static final long serialVersionUID = -4991860764538033995L;
    
        transient private ChildClass child;
    
        ...
    }
    

    ChildClass 只是一个空的(非Serializable)类。测试如下:

    ...
    DummyClass dc = new DummyClass();
    ChildClass mockChild  = mock(ChildClass.class);
    dc.setChild(mockChild);
    copier.copy(dc);
    

    ... 这不会引发任何 NotSerializableException。

    你想测试什么? deep-copier 还是传递给它的类?

    【讨论】:

    • 感谢您的 cmets。我尝试使用包含 DummyClass 的深层副本参数的线程进行测试,该 DummyClass 具有瞬态子对象。因此,当我使用 DummyClass 对象 dc 创建一个新的 DummyThread 时出现异常,该对象也是一个模拟对象,因为该类包含一堆字段。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2015-02-21
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多