假设我有类a,它创建了类b的实例。假设类b是从通过Web调用反序列化的json更新的。
Class A
{
function onNewJSONMessage(array) {
for data in array {
B *b = new B();
b.updateWithData(b);
self.myObjects.add(b);
}
}
}
Class B {
function updateWithData(data) {
// self.prop1 = data.prop1;
// self.prop2 = data.prop2;
// self.prop3 = data.prop3;
// ...
}
}
暂时忽略这种伪语言,只关注测试,我有两种方法可以测试它。
当受试者(A类)使用一个对象获取onNewJSONMessage时,
当受试者(B类)获得带有一个对象的updateWithData
时我喜欢(1)因为当我在onNewJSONMessage上开发时,我可以在updateWithData中打出正确的行,并确保A正确地创建B对象。另一方面,(2)的测试更合适,因为它们是受测试对象的本地测试。我应该使用哪一个?
如果我使用(1),我如何添加不是特定于从服务器处理json消息的测试?假设我不仅可以从A类更新B,还可以更新C类。
如果我使用(2),我如何确保在我的方法中处理服务器json,我正在调用正确的'updateWithData'调用?我听说测试'实施'这不是一件好事。 (在这种情况下很难测试该方法在模拟上被调用,除非我模拟B的初始化,这很痛苦。)
写这两篇文章很乏味,更不用说重复测试了。有什么想法吗?答案 0 :(得分:0)
序列化代码属于与模型本身分开的某个地方。 根据您的平台,您可以使用通用的反序列化器,使用模型注释进行调整。但是,我们假设您希望编写自己的代码。
然后我希望两种方法(填充B的方法和创建A并添加B的方法)位于单独的C类中,C类负责反序列化A和B. C将调用类B中的构造函数和setter方法以及A中的某种addB()方法。 C类的单元测试属于单独的CTest类。
如何测试这取决于反序列化的难易程度,但一种很好的方法是从JSON反序列化为A和B实例,然后从那里反向回JSON并检查结果是否保持不变。
有点事后的想法: 通常,在一个类的代码调用另一个类中的代码的情况下,您可以模拟第二个类以防止两次测试相同的代码。但我不建议将其用于POJO型号。