Как вызвать функцию карри на макете?

#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)} )