То, что вы пытаетесь сделать здесь, это, по сути, убедиться, что фабричный метод действительно вернул правильный объект. Существует этот связанный вопрос , в котором принято решение не проверять результат фабричного метода, кроме проверки того, что он действительно возвращает объект правильного типа. Поведение этого объекта должно быть проверено в UnitTests для этого типа.
В ответе на этот связанный вопрос о модульном тестировании лямбд Стюарт Маркс утверждает, что
Если код в лямбде достаточно сложен, чтобы его можно было проверить, возможно, этот код следует реорганизовать из лямбды, чтобы его можно было протестировать с использованием обычных методик.
Теперь, реальный вопрос: если бы это была не лямбда, а конкретный класс MyBodyContentAppender
, который реализует функциональный интерфейс Consumer<Email>
, как бы вы протестировали это? Какие тесты вы бы написали для этого класса?
Возможно, вы бы написали тесты, чтобы убедиться, что при Email
вызов accept()
действительно вызывает appendBody()
с соответствующими параметрами, возможно, при вызове с аргументом null
выдается NullPointerException
и т. Д. Возможно, вы не убедитесь, что email.appendBody()
работает должным образом, поскольку это охватывается тестами для Email
. Возможно, вам придется смоделировать Email
для этих тестов, если их трудно создать.
Ну, все эти тесты также можно выполнить для лямбды. Ваша проблема в том, что фабрика и тип созданного объекта являются частными, поэтому с точки зрения вашего теста, единственный способ получить доступ к этому объекту - через параметр, передаваемый (mocked) emailBuilder.buildEmail()
.
Если вы используете Mockito для насмешки emailBuilder
, вы можете захватить аргументы этого метода с помощью ArgumentCaptor
s (см. 15. Захват аргументов для дальнейших утверждений (начиная с 1.8.0) ), Я уверен, что другие насмешливые библиотеки предоставляют аналогичную функциональность.