Reputation: 6271
I am getting the org.mockito.exceptions.misusing.InvalidUseOfMatchersException: exception when I try to java JUnit.
Code:
@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;
}
}
Exception:
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)
Upvotes: 0
Views: 132
Reputation: 326
Your problem is in getPhoenixOrder method. You can't use argument matchers in the setters like:
salesOrderItem.setOrderItemIdentifier(Mockito.any(Long.class));
salesOrderItem.setProductUnitPrice(Mockito.any(String.class));
Argument matchers are used for mocking, but they do not generate random data like you are trying to do there. You can just set a real value or use mock method:
salesOrderItem.setOrderItemIdentifier(Mockito.mock(Long.class));
salesOrderItem.setProductUnitPrice(Mockito.mock(String.class));
Upvotes: 0
Reputation: 26016
Matchers must not be used outside of when or verify calls.
This is clearly not the case in your code:
salesOrderItem.setOrderItemIdentifier(Mockito.any(Long.class));
salesOrderItem.setProductUnitPrice(Mockito.any(String.class));
For more details for this requirement, see How do Mockito matchers work?
Upvotes: 1