I am getting Invalid use of matchers Exception when i use the below statement. Mockito.when(CrossSellOffersRetrievalService.isHourInInterval(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true);
How to avoid this exception?
class:
@Component
public class CrossSellOffersRetrievalService {
@Autowired
private CrossSellOffersRetrieval crossSellOffersRetrieval;
public List<CrossSellOffer> getApplicableOffers(String channelId, String customerId, String cinSuffix, String countryCode,
String interactionPoint, String sessionId, Integer numberOfOffers)throws CrossSellOffersException {
if (isOnLineServerTime()) {
if (numberOfOffers == null) {
numberOfOffers = 1;
}
List<CrossSellOffer> crossSellOffersList = crossSellOffersRetrieval.getApplicableOffers(channelId, customerId, cinSuffix,
countryCode, interactionPoint, sessionId,numberOfOffers);
return crossSellOffersList;
} else {
throw new CrossSellOffersException(Constants.ERROR_CODE, Constants.WRONG_SERVER_TIME);
}
}
public static boolean isHourInInterval(String target, String start, String end) {
return ((target.compareTo(start) >= 0) && (target.compareTo(end) <= 0));
}
public boolean isOnLineServerTime() {
String serverTime = DateTimeFormatter.ofPattern("HH.mm").format(LocalDateTime.now(ZoneId.of("Asia/Singapore")));
boolean value = isHourInInterval(serverTime,"08.00","23.15");
return value;
}
}
Junit test class :
@RunWith(MockitoJUnitRunner.class)
public class CrossSellOffersRetrievalServiceTest {
@InjectMocks
private CrossSellOffersRetrievalService crossSellOffersRetrievalService;
@Mock
private CrossSellOffersRetrieval crossSellOffersRetrieval;
@Test
public void getApplicableOffersTest() throws CrossSellOffersException {
Mockito.when(CrossSellOffersRetrievalService.isHourInInterval(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(true);
Mockito.when(crossSellOffersRetrieval.getApplicableOffers(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), 1)).thenReturn(CrossSellOffersRetrievalHandlerTest.sampleCrossSellOffersList());
List<CrossSellOffer> crossSellOffersList = crossSellOffersRetrievalService.getApplicableOffers("MBSG", "S7754061Z", "00", "SG", "NEW_CC_ADDON", "IBOXS007", 1);
}
}
output:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:
-> at com.dbs.crossselloffers.offers_retrieval.CrossSellOffersRetrievalServiceTest.getApplicableOffersTest(CrossSellOffersRetrievalServiceTest.java:12)
-> at com.dbs.crossselloffers.offers_retrieval.CrossSellOffersRetrievalServiceTest.getApplicableOffersTest(CrossSellOffersRetrievalServiceTest.java:12)
-> at com.dbs.crossselloffers.offers_retrieval.CrossSellOffersRetrievalServiceTest.getApplicableOffersTest(CrossSellOffersRetrievalServiceTest.java:12)
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))