你在那里有点令人讨厌的情况。如果您要编码为静态格式,则第一种方法就是处理方法。如果这只是您自己的格式,那么除了第二种方法外,没有其他人需要解码。但是您实际上并不适合这些类别。
我要做的是尝试按抽象级别分解事物。
所以我将从位级别的东西开始,我会测试类似
bitWriter = new BitWriter();
bitWriter.writeInt(42, bits = 7);
assertEqual( bitWriter.data(), {0x42} )
因此,想法是写者知道如何写出最原始的字段类型,例如int。
更复杂的类型将通过使用和测试类似的东西来实现:
bitWriter = new BitWriter();
writeDate(bitWriter, new Datetime(2001, 10, 4));
bitWriter2 = new BitWriter();
bitWriter2.writeInt(2001, 12)
bitWriter2.writeInt(10, 4)
bitWriter2.writeInt(4, 6)
assertEquals(bitWriter.data(), bitWriter2.data() )
注意,这避免了有关如何打包实际位的任何知识。该测试已通过之前的测试进行了测试,对于该测试,我们将假设它可以正常工作。
然后在下一个抽象层次上
bitWriter = new BitWriter();
encodeObject(bitWriter, myObject);
bitWriter2 = new BitWriter();
bitWriter2.writeInt(42, 32)
writeDate(bitWriter2, new Datetime(2001, 10, 4));
writeVarString(bitWriter2, "alphanumeric");
assertEquals(bitWriter.data(), bitWriter2.data() )
因此,再次,我们不会尝试包含有关如何实际编码varstrings或日期或数字的知识。在此测试中,我们只对encodeObject产生的编码感兴趣。
最终结果是,如果更改了日期格式,则必须修复实际上涉及日期的测试,但是所有其他代码和测试都与日期的实际编码方式无关,并且一旦更新了代码即可这项工作,所有这些测试都将通过。
myObject
从去myObject
到{ 0x01, 0x02, 0xFF }
?可以分解并测试该算法吗?我要问的原因是,目前看来,您已经进行了一项测试,可以证明一个神奇的事物会产生另一个神奇的事物。您唯一的信心就是一个输入会产生一个输出。如果您可以分解算法,则可以对算法有更大的信心,并减少对神奇输入和输出的依赖。