Ответ 1
Вы не можете unit test lambda напрямую, так как у него нет имени. Нет способа вызвать его, если у вас нет ссылки на него.
Обычной альтернативой является рефакторинг лямбда в именованный метод и использование ссылки на метод из кода продукта и вызов метода по имени из тестового кода. Как вы заметили, этот случай нельзя реорганизовать таким образом, потому что он захватывает foo
, и единственное, что может быть захвачено ссылкой метода, это приемник.
Но ответ от yshavit затрагивает важный вопрос о необходимости использования unit test частных методов. Лямбда, безусловно, может считаться частным методом.
Здесь тоже больше. Одним из примеров модульного тестирования является то, что вам не нужно unit test что-либо, что слишком просто перебить. Это хорошо согласуется с идеальным случаем для лямбда, который является выражением, которое так просто, очевидно, правильно. (По крайней мере, это то, что я считаю идеальным.) Рассмотрим пример:
baz -> baz.setFoo(foo)
Есть ли какое-либо сомнение в том, что это лямбда-выражение при передаче ссылки Baz
вызовет его метод setFoo
и передаст его foo
в качестве аргумента? Возможно, это так просто, что его не нужно тестировать на единицу.
С другой стороны, это всего лишь пример, и, возможно, фактическая лямбда, которую вы хотите протестировать, значительно сложнее. Я видел код, который использует большие, вложенные, многострочные лямбды. См. этот ответ и его вопрос и другие ответы, например. Такие лямбды действительно трудно отлаживать и тестировать. Если код в лямбде достаточно сложный, что он требует тестирования, возможно, этот код следует переделать из лямбда, чтобы его можно было протестировать с использованием обычных методов.