Никогда не нужно издеваться над возвращаемым значением и проверять объект одновременно.
Учитывайте следующее:
StringWriterA
- это тестируемый класс.Поэтому вы определенно захотите использовать утверждения для проверки поведения этого класса.Для этого вы макетируете зависимость: StringWriterB
.
Вы не хотите проверить StringWriterB
в своем тесте StringWriterA
, следовательно, любые утверждения StringWriterB
взаимодействия в вашем тесте в неправильном месте .
Вы должны предположить, что StringWriterB
ведет себя как ожидалось.Вы либо хотите убедиться, что StringWriterA
правильно вызвал StringWriterB
(используя verify()
) или , вы хотите смоделировать его ожидаемое поведение и смоделировать возвращаемые значения.тогда проверка неявна, так как ложное возвращаемое значение не будет возвращено, если метод не вызывается.
В вашем случае StringWriterA.append()
не возвращает никакого значения, поэтому возможна только проверка.То, что StringWriterB.append()
также работает, должно иметь аналогичный тест верификации в stringWriterBTest
.
Примечание: Приятно быть явным с тестами.Так как тестовые методы никогда не вызываются вне каркаса, никогда не нужно их печатать, поэтому вы можете иметь гораздо более длинные имена методов, чем в методах производственного кода.Хорошее соглашение:
<underTest>Should<Expected>[When]<Condition>()
т. Е.
stringWriterAShouldAppendConstantAndDelegateToStringWriterB()
stringWriterAShouldThrowNullPointerExceptionWhenNullArgument()
Если в вашей сборке есть неудачные тесты (непрерывная интеграция), тогда вам не нужно выискивать, что пошло не так, имя метода отображается правильно после сбоя, и вы можете прочитать его, чтобы точно знать, какое поведение должно быть исправлено.