【发布时间】:2012-03-04 13:36:08
【问题描述】:
我有一个用具体示例说明的一般性问题。 如果所有组件对象都已经测试过了,您建议测试复合对象的程度是多少?
作为一个具体的例子,考虑下面的 NullTerminatedStringReader。它从字节缓冲区中读取一个以空字符结尾的字符串。为此,它使用 Javas Charset 解码器。
我当然想测试我的 NullTerminatedStringReader。它应该能够读取UTF8、UTF16、ASCII等各种字符串。
想象一下,我已经编写了 CharsetDecoder 并测试了它可以从各种可能的字符集中解码字符。它确实经过了很好的测试和尝试,我毫不怀疑它有效。现在我编写了一个使用 CharsetDecoder 的 NullTerminatedStringReader。理论上,我希望 NullTerminatedStringReader 能够处理 CharsetDecoder 可以解码的所有字符集字符串。如果我使用的是 TDD,我会想推动我的设计,所以我会写很多测试来测试 NullTerminatedStringReader 的每个字符集解码:
...
void testNullTerminatedStringReaderCanDecodeUTF8String()
void testNullTerminatedStringReaderCanDecodeASCIIString()
...
但这似乎是多余的,因为在 CharsetDecoder 的测试中我有所有这些测试:
...
void testCharsetDecoderCanDecodeUTF8Char()
void testCharsetDecoderCanDecodeASCIIChar()
...
我不确定在这里做什么,因为如果没有 NullTerminatedStringReader 的测试,我如何驱动它的设计来支持所有这些解码?我是否在 NullTerminatedStringReader 的错误级别上进行测试?如果我不进行测试,它似乎也缺少一些东西,因为理论上我知道 NullTerminatedStringReader 正在使用 CharsetDecoder 并且我知道它所做的只是附加字符以形成一个字符串,所以这里不会出错。如果 CharsetDecoder 有效,NullTerminatedStringReader 也应该有效。但是如果它不使用 CharsetDecoder 怎么办 - 我认为假设不知道 NullTerminatedStringReader 的实现然后编写测试会更清楚,但这会导致看起来像冗余测试的结果.. 困境?你打赌。
class NullTerminatedStringReader
{
private Charset charset;
public String read(ByteBuffer buffer)
{
StringBuilder sb = new StringBuilder();
while (true)
{
char charVal = readChar(buffer, charset.newDecoder()); // unicode char, possibly span several bytes
if (charVal == '\0')
break;
sb.append(charVal);
}
return sb.toString();
}
private char readChar(ByteBuffer buffer, CharsetDecoder decoder) {...}
}
【问题讨论】:
标签: java unit-testing tdd