У меня есть общий вопрос, проиллюстрированный конкретным примером.
Сколько бы вы порекомендовали тестировать составные объекты, когда все компоненты компонентов уже протестированы?
В качестве конкретного примера рассмотрим NullTeridityStringReader ниже. Он читает из байтового буфера строку с нулевым символом в конце. Для этого используется декодер Javas Charset.
Я, конечно, хочу протестировать мой NullTeridityStringReader. Он должен уметь читать все виды строк, такие как UTF8, UTF16, ASCII и т. Д.
Представьте, что я написал CharsetDecoder и проверил, что он будет декодировать символы из всех возможных кодировок. Это действительно хорошо проверено и испытано, и я не сомневаюсь, что это работает. Теперь я пишу NullTeridityStringReader, который использует CharsetDecoder. Теоретически я хочу, чтобы NullTeridityStringReader мог обрабатывать все строки кодировок, которые может декодировать CharsetDecoder. Если бы я использовал TDD, я бы хотел управлять своим дизайном, поэтому я бы написал множество тестов, тестирующих декодирование каждой кодировки для NullTerminationStringReader:
...
void testNullTerminatedStringReaderCanDecodeUTF8String()
void testNullTerminatedStringReaderCanDecodeASCIIString()
...
Но это кажется избыточным, потому что в тесте для CharsetDecoder у меня есть все эти тесты:
...
void testCharsetDecoderCanDecodeUTF8Char()
void testCharsetDecoderCanDecodeASCIIChar()
...
Я не уверен, что здесь делать, потому что без тестов для NullTeridityStringReader, как я могу управлять его дизайном для поддержки всех этих декодирований? Я тестирую на неправильном уровне для NullTerminationStringReader? Если я не выполняю тесты, это также кажется, что чего-то не хватает, потому что в теории я знаю, что NullTeridityStringReader использует CharsetDecoder, и я знаю, что все, что он делает, это добавляет символы для формирования строки, так что здесь мало что может пойти не так. Если CharsetDecoder работает, то должен работать NullTeridityStringReader. Но что, если он не использовал CharsetDecoder - я думаю, что более понятно не предполагать, что он не знает о реализации NullTerminationStringReader, а затем писать тесты, однако это приводит к тому, что кажется избыточными ... dillema? Вы ставите.
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) {...}
}