我具有以下功能:
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));
}
答案 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));