我在理解如何处理以下内容以对课程进行单元测试时遇到了一些麻烦。
被测对象是一个由 1 个公共方法组成的对象,该方法接受 A 类型的对象列表并返回一个对象 B(它是一个二进制流)。由于生成的二进制流的性质会变得很大,因此对于测试输出来说这不是一个很好的比较。该流是使用几个私有实例帮助器方法构建的。
class Foo
{
private BinaryStream mBinaryStream;
public Foo() {}
public BinaryStream Bar(List<Object> objects) {
// perform magic to build and return the binary stream;
// using several private instance helper methods.
Magic(objects);
MoreMagic(objects);
}
private void Magic(List<Object> objects) { /* work on mBinaryStream */ }
private void MoreMagic(List<Object> objects) { /* work on mBinaryStream */ }
};
现在我知道我需要测试类的行为,因此需要测试 Bar 方法。但是,将方法的输出与预定义的结果进行比较是不可撤销的(在空间和时间方面)。变化的数量太大(而且它们是极端情况)。
一种选择是将这些私有辅助方法重构为(a)可以进行单元测试的单独类。然后可以将二进制流切成更小更好的可测试块,但这里还有很多情况需要处理,并且比较二进制结果将违背单元测试的快速时间。这是我宁愿不选择的选择。
另一种选择是创建一个定义所有这些私有方法的接口,以便验证(使用模拟)是否调用了这些方法。然而,这意味着这些方法必须具有公共可见性,这也不好。并且验证方法调用可能足以进行测试。
另一种选择是从类继承(使私有受保护)并尝试以这种方式进行测试。
我已经阅读了有关此类问题的大部分主题,但它们似乎处理了良好的可测试结果。这与本次挑战不同。
你将如何对这样的课程进行单元测试?