Как проверить, было ли передано правильное значение лямбды в качестве аргумента (с помощью Mockito)? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть функция:

public class Cache {
    (...)
    public void removeAllIf(Predicate<Product> predicate) {
        (...)
    }
}

И я звоню productsCache.removeAllIf(Product::isChecked);

В настоящее время я проверяю это с

then(productsCache).should().removeAllIf(any(Predicate.class));

, ноэто не точно (не тестирование, если переданная лямбда Product::isChecked).Вторая проблема заключается в том, что я получаю сообщение lint: Непроверенное назначение .

Это лучшее решение?

Отредактировано:

Я не хочу тестировать removeAllIf реализацию функции.Я хочу проверить, был ли removeAllIf вызван с правильным аргументом.

Сценарий для проверки:

public class Repository {
    public void removeCheckedProducts() {
        remoteDataSource.removeCheckedProducts();
        localDataSource.removeCheckedProducts();
        cache.removeAllIf(Product::isChecked);

    }
}

Модульный тест:

@Test
public void removeCheckedProducts() {

    //when
    repository.removeCheckedProducts();

    //then
    then(remoteDataSource).should().removeCheckedProducts();
    then(localDataSource).should().removeCheckedProducts();
    then(cache).should().removeAllIf(any(Predicate.class));


}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете проверить поведение аргумента removeAllIf вместо равенства.

Predicate<Product> removeAllIfArgument = mockingDetails(cache).getInvocations()
        .iterator()
        .next()
        .getArgument(0);

Product checkedProduct = mock(Product.class);
Product uncheckedProduct = mock(Product.class);
given(checkedProduct.isChecked()).willReturn(true);
given(uncheckedProduct.isChecked()).willReturn(false);

assertTrue(removeAllIfArgument.test(checkedProduct));
assertFalse(removeAllIfArgument.test(uncheckedProduct));
0 голосов
/ 23 октября 2018

Вы можете использовать ArgumentCaptor

@Captor
  ArgumentCaptor<Predicate> captor = ArgumentCaptor.forClass(Predicate.class);;

@Test
public void removeCheckedProducts() {

    //when
    repository.removeCheckedProducts();

    //then
    then(remoteDataSource).should().removeCheckedProducts();
    then(localDataSource).should().removeCheckedProducts();
    then(cache).should().removeAllIf(captor.capture());
    Predicate t = Product.checkPredicate();
    assertSame(t,captor.getValue());



}
...