【发布时间】:2018-10-23 09:46:31
【问题描述】:
我有这个功能:
public class Cache {
(...)
public void removeAllIf(Predicate<Product> predicate) {
(...)
}
}
我打电话给productsCache.removeAllIf(Product::isChecked);
目前我用
测试它then(productsCache).should().removeAllIf(any(Predicate.class));
但这并不准确(不测试传递的 lambda 是否为 Product::isChecked)。第二个问题是我收到 lint 消息:Unchecked assignment.
有更好的解决方案吗?
已编辑:
我不想测试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));
}
【问题讨论】:
-
向我展示您与此场景相关的所有逻辑?
removeAllIf方法的实现和Product类结构传入的谓词。 -
你应该关注
Product.isChecked的定义来对其进行单元测试。 -
我正在测试是否调用了
removeAllIf,而不是 Product.isChecked 的实现。请检查我的编辑。 -
如果调用者的源代码看起来像
removeAllIf(Product::isChecked),那么编写测试代码来验证这段微不足道的代码是否真正使用参数Product::isChecked调用removeAllIf是一种资源浪费。你应该专注于测试调用代码是否做了它应该做的事情(好吧,好吧,如果调用者是一个名为callTheMethodRemoveAllIfWithProductIsChecked的方法并且它的文档说“这个方法的唯一目的是调用removeAllIf论点Product::isChecked”,那么,你就在正确的道路上)。
标签: java unit-testing lambda java-8 mockito