Mockito-无效使用Matchers异常

使用以下语句时,我得到的Matchers无效使用异常。 Mockito.when(CrossSellOffersRetrievalService.isHourInInterval(Mockito.anyString(),Mockito.anyString(),Mockito.anyString()))。thenReturn(true);

如何避免这种异常?

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测试类:

@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(),1)).thenReturn(CrossSellOffersRetrievalHandlerTest.sampleCrossSellOffersList());
        List<CrossSellOffer> crossSellOffersList = crossSellOffersRetrievalService.getapplicableOffers("MBSG","S7754061Z","00","SG","NEW_CC_ADDON","IBOXS007",1);
    }
}

输出:

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"))
chenglong676 回答:Mockito-无效使用Matchers异常

  

您不能在验证或存根之外使用参数匹配器。

您的CrossSellOffersRetrievalService没有被嘲笑。它是CrossSellOffersRetrievalService的实际实例,已通过模拟实例化。参见the @InjectMocks documentation

因此,您正在尝试对不是模拟的内容进行存根。如果您不想调用实际的isHourInInterval()方法,请考虑对其进行模拟或partially mocking。为此,您可能需要使该方法成为非静态方法。 You can mock a static method,但这通常不是最好的选择。


附加说明:

由于CrossSellOffersRetrievalService是您正在测试的对象,因此您可能不想模拟或部分模拟它-因为如果这样做,您就不会在测试其实际功能。另外,您可能要做要检查您的输出是否符合您的期望,而不仅仅是可以调用该类的方法。

您可以在spy的实际实例上CrossSellOffersRetrievalService,但是我建议编写简单的测试,例如方法:

  1. 有输入。
  2. 使用注入的模拟和when ... thenReturn处理方法中的模拟调用。
  3. 定义您的预期输出。
  4. 使用输入来调用方法。
  5. 验证实际输出等于预期输出。

对每种方法的所有重要情况重复执行,直到覆盖每种方法为止。

如果您的班级难以使用此方法,请考虑更改班级。例如,如果很费心mock或构建满足isHourInInterval的输入,则将该方法封装在一个单独的对象中,然后将其注入CrossSellOffersRetrievalService中。如果它实际上与其他任何内容都不相关,则甚至可以使其成为静态内部类。然后,在测试时,注入始终返回true的模拟。

,

您正在尝试对静态方法进行存根。 Mockito不会那样做。

在下面的行中也出现了错误,在存根调用中混合了匹配器和非匹配器参数(您需要将1更改为{{1} }。

无论如何,查看您要测试的课程,看起来它在一天中的不同时间表现都不同。因此,您可能需要测试其在8:00到23:15之间的行为,以及其他测试来测试其在这些小时之外的行为。

您将需要eq(1)类来设置类似的测试。在Unit testing a class with a Java 8 Clock

中有一些有关如何执行此操作的信息
本文链接:https://www.f2er.com/3122131.html

大家都在问