首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Mockito InvalidUseOfMatchersException when mocking方法

Java Mockito InvalidUseOfMatchersException when mocking方法
EN

Stack Overflow用户
提问于 2019-11-08 23:43:43
回答 1查看 89关注 0票数 0

我在使用mockito2.23.4、junit4和springrunner测试方法时遇到了困难。尽管代码在我看来完全没问题,但我还是得到了InvalidUseOfMatchersException。我不确定我到底错过了什么。任何提示都会对我很有帮助。我将发布下面的代码。

代码语言:javascript
运行
复制
    @RunWith(SpringRunner.class)
    public class FiscalClosingServiceImplTest {
        @InjectMocks
        private FiscalClosingServiceImpl fiscalClosingServiceImpl;
        @Mock
        private IDataBeanManager dataBeanManager;
        @Mock
        private IFiscalClosingPopulator fiscalClosingPopulator;
        @Mock
        private DataBean dataBean;
        @Test
        public void test_getFiscalClosingListByNodeIdAndSiteId_WhenListNotEmpty() throws ServiceException {
            //Arrange
            List<DataBean> dataBeansResult = new ArrayList<DataBean>();
            dataBeansResult.add(dataBean);
            when(dataBeanManager.listBeansByAttributeValue(anyString(), anyString(), anyString(), anyString())).thenReturn(dataBeansResult);
            String siteId = "siteId";
            FiscalClosing fiscalClosingTest = new FiscalClosing();
            fiscalClosingTest.setSiteId(siteId); 
 when(fiscalClosingPopulator.convertBeanToFiscalClosing(any(DataBean.class))).thenReturn(fiscalClosingTest);

        //Act
        List<FiscalClosing> result = fiscalClosingServiceImpl.getFiscalClosingListByNodeIdAndSiteId(anyString(), eq(siteId));

        //Assert
        assertEquals(result.get(0).getSiteId(), fiscalClosingTest.getSiteId());
    }
}

要测试的方法如下:

代码语言:javascript
运行
复制
@Override
    public List<FiscalClosing> getFiscalClosingListByNodeIdAndSiteId(final String nodeId, final String siteId)
            throws ServiceException {
        log.debug("Retrieving FiscalClosing by transactionLastUpdatedDateTime");
        List<FiscalClosing> fiscalClosingList = new ArrayList<FiscalClosing>();

        List<DataBean> dataBeans = dataBeanManager.listBeansByAttributeValue(
                EntityConstant.getConstant(CONSTANTS.FISCAL_CLOSING_ID),
                EntityConstant.getConstant(CONSTANTS.FISCAL_CLOSING_NODE_ID_ID), nodeId, "");

        if(dataBeans.isEmpty()) {
            return fiscalClosingList; 
        }

        for(DataBean dataBean : dataBeans) {
            FiscalClosing fiscalClosing = fiscalClosingPopulator.convertBeanToFiscalClosing(dataBean);
            fiscalClosingList.add(fiscalClosing);
        }

        return fiscalClosingList.stream().filter(item -> item.getSiteId().equals(siteId)).collect(Collectors.toList());
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-09 00:05:56

在测试的"Act“部分,您使用参数匹配器作为测试方法的参数:

代码语言:javascript
运行
复制
List<FiscalClosing> result = fiscalClosingServiceImpl.getFiscalClosingListByNodeIdAndSiteId(anyString(), eq(siteId));

你不能像这样使用匹配器,它们应该用来以一种更通用的方式定义mock的行为。在调用该方法时,您应该传递实际值,尽管根据您模拟方法其余部分的方式,这些值不必是有效的。

在您的情况下,它可以像这样简单:

代码语言:javascript
运行
复制
List<FiscalClosing> result = fiscalClosingServiceImpl.getFiscalClosingListByNodeIdAndSiteId("nodeId", "siteId");

然后,您可能必须更新您的测试以确保返回正确的站点id。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58769714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档