如何测试是否将正确的lambda值作为参数传递(使用Mockito)?

时间:2018-10-23 09:46:32

标签: java unit-testing lambda java-8 mockito

我具有以下功能:

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

然后我打电话给productsCache.removeAllIf(Product::isChecked);

目前我用

进行测试

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

,但这不准确(无法测试传递的lambda是否为Product::isChecked)。第二个问题是我收到了皮棉消息:未检查的作业

这是更好的解决方案吗?

已编辑:

我不想测试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 :(得分:0)

您可以使用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());



}

答案 1 :(得分:0)

您可以检查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));