#scala #testing #mocking #mockito
Вопрос:
У меня есть общая функция, которая выглядит так
def getFromCacheOrCallService[T: ClassTag](cacheKey: String, duration: Duration = cacheDefaultDuration)(
callServiceToFetchValue: => Try[T]
): Try[T]
и я пытаюсь понять, как издеваться над этой функцией таким образом, чтобы она всегда вызывалась callServiceToFetchValue
и использовалась вместо этого. У меня есть это до сих пор
doAnswer(invocation => {
invocation.getArgumentAt(1, classOf[() => Try[marketplace]])()
}).when(marketplaceCache).cacheable(any(), any())(any())(any())
Который, если я правильно понимаю, что я делаю, должен вызывать переданную функцию, но всякий раз, когда я пытаюсь запустить, я получаю эту ошибку
Invalid use of argument matchers!
4 matchers expected, 3 recorded:
Почему он говорит, что ожидает 4 совпадения? У меня 4 совпадения, я не понимаю, в чем проблема.
Ответ №1:
Проблема не в функции карри, а в параметре передачи по имени. Mockito не очень хорошо поддерживает его, и я не знаю никаких хороших обходных путей, кроме фактического объявления этого параметра как реальной функции () => Try[T]
(или, возможно, String => Try[T]
— это действительно выглядит немного странно без передачи ключа).
Комментарии:
1. О, ну что ж, это облом, чтобы услышать, есть ли, по крайней мере, способ поставить счетчики, чтобы они работали? Я все еще не понимаю, почему там написано, что их только 3, когда их 4
2. @DavidWolak, как я уже сказал, не то, что я знаю 🙁
Ответ №2:
Для всех, кто столкнулся с аналогичной проблемой, решение, которое я получил, состояло в изменении определения getFromCacheOrCallService
на
def getFromCacheOrCallService[T: ClassTag](cacheKey: String, duration: Duration = cacheDefaultDuration)(
callServiceToFetchValue:() => Try[T]
): Try[T]
И тогда это сработало. Однако, поскольку большую часть времени я выполнял такие функции, как
def getFromCacheOrCallService("key", Duration(10, MINUTES)(callServiceToFetchValue(SomeInput))
Мне пришлось сменить его на
def getFromCacheOrCallService("key", Duration(10, MINUTES)({ () => callServiceToFetchValue(SomeInput)} )