在.NET中测试Oracle Coherence IPortableObject实现

时间:2009-05-19 23:15:22

标签: c# unit-testing oracle-coherence

为了获得良好的测试覆盖率,我想测试WriteExternal的{​​{1}}和ReadExternal方法(如Creating an IPortableObject Implementation (.NET)所述)。

这里的代码类似于我在测试方法中的代码(我喜欢它,并且它可以工作)。

IPortableObject

但为了实现这一点,我做了子类Person person = new Person { Name = "John Doe" }; Person personCopy = CoherenceTestHelper.CopyUsingPofSerialization<Person>(person); Assert.AreEqual(person, personCopy); 来覆盖PofStreamWriterBeginProperty来覆盖PofStreamReader。对我来说,这闻起来有点滑稽,但我无法想出更好的解决方案。下面是我的CoherenceTestHelper的实际代码。

问题:还有其他任何单位测试过他们的AdvanceTo实施方式更好吗?

IPortableObject

2 个答案:

答案 0 :(得分:0)

此测试过于关注IPofReaderIPofWriter的实际执行情况。我建议你使用Rhino Mocks之类的框架创建一个读者/作者的模拟。将您的POF方法传递给模拟的读者/作者。然后简单地声明使用正确的参数调用读/写方法。

答案 1 :(得分:0)

我一直在研究如何对IPofSerializer进行单元测试,我希望它与您的问题相似。我发现,为了正确序列化和反序列化用户类型,您必须调用PofStreamWriter.WriteObject和PofStreamReader.ReadObject。用户类型也必须在PofContext中注册才能使其正常工作。

这样做的原因是PofStreamWriter类包含一个嵌套的子类,它在序列化用户类型时会指向它。此子类编写有关PofStreamReader随后用于正确反序列化类型的类型的附加数据。没有这些附加数据,PofStreamReader无法确定它是什么类型以及应该使用什么序列化程序。看起来它只是没有设置允许在完全隔离中测试串行器,因为在序列化时PofStreamReader和PofStreamWriter在内部维护了很多状态。

为了测试IPofSerializers,我正在做以下

var context = new SimplePofContext()
context.RegisterUserType(1001, typeof(SerializableType), new SerializatableTypeSerializer())

using (var ms = new MemoryStream())
{
    var writer = new PofStreamWriter(new DataWriter(ms), context);
    writer.WriteObject(0, object);

    ms.Seek(0,0);

    var reader = new PofStreamReader(new DataReader(ms), context);
    var ob = reader.ReadObject(0)
} 

我怀疑,但尚未经过测试,对于IPortableObjects,您不必在上下文中注册任何内容,以便能够正常工作。