首页 > 解决方案 > Junit中的InvalidUseOfMatchersException

问题描述

当我尝试使用 java JUnit 时,我得到了 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 异常。

代码:

@RunWith(MockitoJUnitRunner.class)
public class EmailAggregatorTest {

@Mock
private SalesOrderDAO salesDao;

@InjectMocks
private EmailAggregator emailAggregator;

@Test
public final void triggerCreditSignalConfirmationEmail() {
    Collection<Order> orders = getOrder();
    when(salesDao.getSalesOrderItems(1l)).thenReturn(getSalesOrderList());
    OrderEmail aggregateCreditSignalEmails = emailAggregator.aggregateCreditSignalEmails(orders);
    Assert.assertEquals("TRANS_OrderConf", aggregateCreditSignalEmails.getEmails().get(0).getEmailCampaignName());

}

private List<SalesOrderItem> getSalesOrderList() {
    List<SalesOrderItem> salesOrderItemList = new ArrayList<>();
    SalesOrderItem salesOrderItem = salesOrder();
    salesOrderItemList.add(salesOrderItem);
    return salesOrderItemList;
}

private SalesOrderItem salesOrder() {
    ProductCatalog productCatalog = new ProductCatalog();
    SalesOrderItem salesOrderItem = new SalesOrderItem();
    salesOrderItem.setOrderItemIdentifier(Mockito.any(Long.class));
    salesOrderItem.setProductUnitPrice(Mockito.any(String.class));
    salesOrderItem.setProductNetAmount(BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_EVEN).toPlainString());
    salesOrderItem.setDiscountAmount(BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_EVEN).toPlainString());
    salesOrderItem.setItemNetAmount(BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_EVEN).toPlainString());
    salesOrderItem.setServiceCreditAmount(BigDecimal.ZERO);
    salesOrderItem.setTaxAmount(BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_EVEN).toPlainString());
    salesOrderItem.setTaxPercentage(BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_EVEN));
    salesOrderItem.setProductQuantity(1);
    productCatalog.setProductCatalogIdentifier(14625);
    salesOrderItem.setProductCatalog(productCatalog);
    return salesOrderItem;
}

private Collection<Order> getOrder() {
    List<FreeProductQueue> freeProductList = new ArrayList<>();
    FreeProductQueue freeProduct = new FreeProductQueue();
    freeProduct.setAddress1("9230 Research Blvd");
    freeProduct.setAddress2("street");
    freeProductList.add(freeProduct);
    List<Order> order = new ArrayList<Order>(
            transform(freeProductList, new ConvertFreeProductQueueToPhoenixOrderFunction()));
    SalesOrder salesOrder = new SalesOrder();
    salesOrder.setOrderIdentifier(Mockito.anyLong());
    salesOrder.addSalesOrderItem(salesOrder());
    order.stream().forEach(q -> q.addSales(salesOrder));
    return order;
}

}

例外:

    org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
1 matchers expected, 3 recorded.
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.
    at com.dbcc.ecomm.legalzoom.service.EmailAggregatorTest.triggerCreditSignalConfirmationEmail(EmailAggregatorTest.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

标签: javajunitmockito

解决方案


不得在 when 或 verify 调用之外使用匹配器。

在您的代码中显然不是这种情况:

salesOrderItem.setOrderItemIdentifier(Mockito.any(Long.class));
salesOrderItem.setProductUnitPrice(Mockito.any(String.class));

有关此要求的更多详细信息,请参阅Mockito 匹配器如何工作?


推荐阅读