代码之家  ›  专栏  ›  技术社区  ›  AppiDevo

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

  •  0
  • AppiDevo  · 技术社区  · 6 年前

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

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

    现在我用

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

    但这并不准确(如果通过的lambda是 Product::isChecked ). 第二个问题是,我得到了lint消息: 未检查的分配 .

    编辑:

    我不想测试 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 回复  |  直到 6 年前
        1
  •  0
  •   HPCS    6 年前

    你可以使用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());
    
    
    
    }
    
        2
  •  0
  •   Alexander Pankin    6 年前

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