Определите лямбда-функцию как ограничение аргумента в Споке - PullRequest
0 голосов
/ 28 сентября 2018

Есть фрагмент кода, который я хочу покрыть модульным тестом

public List<Product> fetchProducts() {
   ...
   String userId = anotherObj.getId()
   return caller.call(client -> client.getProducts(userId));
}

примечание: я не могу изменить этот код

СейчасЭто модульный тест, который работает с использованием подстановочного знака (пропущено все, что не связано):

def anotherObj = Mock( ... )
def caller = Mock( ... )

...

when:
  subject.fetchProducts()

then:
  1 * anotherObj.getId() >> USER_ID
and:
  1 * caller.call(_) >> mockedApiResponse

проблема

Iхотите проверить, что функция call действительно вызывается с функцией, которая получает параметр и вызывает этот параметр с соответствующим аргументом

псевдокод

then:
  1 * anotherObj.getId() >> USER_ID
and:
  1 * caller.call( { it(obj -> obj.getProducts(USER_ID)) } ) >> mockedApiResponse

1 Ответ

0 голосов
/ 28 сентября 2018

Просто если кто-то сталкивался с этим;

Решением является определение поведения для макета caller: когда caller вызывается с аргументом, тогда

  • Сначала этот аргумент является Function
  • На самом деле макет вызывает его с ровно одним аргументом
  • Этот аргумент является классным макетом, поэтому позже мы сможем создать для него утверждения.

Код:

def anotherObj = Mock( ... )
def caller = Mock( ... )
def client = Mock( ... )

...

when:
  def response = subject.fetchProducts()

then:
  1 * anotherObj.getId() >> USER_ID
and:
  1 * caller.call(_) >> { Function lambda ->
      lambda.apply(client)
      return apiResponse
  }
and:
  1 * client.getProducts(USER_ID)
and:
  response == ...
...