java - Mockito - 预期 0 个匹配器,记录 2 个(InvalidUseOfMatchersException)
问题描述
对于类似的查询,我参考了 Stackoverflow 上的所有可用资源。但我不确定这个测试的问题是什么:
它抛出以下异常。
[main] ERROR com.example.dao.spring.TransactionDAOSpring - org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!0 matchers expected, 2 recorded.
以下是代码:
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import com.example.dto.DisplayTwo;
import com.example.dto.DisplayOne;
import com.example.dto.DisplayThree;
public class TransactionDAOSpringTest {
TransactionDAOSpring transactionDAOSpring;
@Mock
DataSource dataSource;
@Mock
JdbcTemplate jdbcTemplate;
@Mock
SimpleJdbcCall storedProc;
@Rule
public ExpectedException thrown = ExpectedException.none();
private Map<String, Object> resultMap;
private List<DisplayOne> displayOne;
private List<DisplayTwo> displayTwo;
private List<DisplayThree> displayThree;
@Before
public void beforeMethod() {
MockitoAnnotations.initMocks(this);
transactionDAOSpring = new TransactionDAOSpring();
transactionDAOSpring.setJdbcTemplate(jdbcTemplate);
transactionDAOSpring.setDataSource(dataSource);
transactionDAOSpring.retrieveResultStoredProc = storedProc;
resultMap = new HashMap<String, Object>();
displayOne = new ArrayList<DisplayOne>();
displayTwo = new ArrayList<DisplayTwo>();
displayThree = new ArrayList<DisplayThree>();
}
@Test
public void testRetrieve_When_ResultSet_Not_Empty() {
displayOne.add(new DisplayOne());
displayTwo.add(new DisplayTwo());
displayThree.add(new DisplayThree());
resultMap.put("DisplayOneResultSet", displayOne);
resultMap.put("DisplayTwoResultSet", displayTwo);
resultMap.put("DisplayThreeResultSet", displayThree);
when(storedProc.execute(anyMapOf(String.class, Object.class)))
.thenReturn(resultMap);
Map<String, Object> returnedResultMap = transactionDAOSpring.retrieve(anyString(),
anyLong());
assertEquals(resultMap.size(), returnedResultMap.size());
}
更新:调试后,似乎无法从数据源获取连接,因此引发异常。
任何帮助,将不胜感激。
解决方案
匹配器喜欢anyString()
或anyLong()
可用于模拟对象,例如内部when()
或verify()
调用。在你的情况下:
Map<String, Object> returnedResultMap = transactionDAOSpring.retrieve(
anyString(), anyLong());
是真正的方法调用。我认为这就是原因InvalidUseOfMatchersException
。尝试使用空字符串和0L等存根值调用您的方法
推荐阅读
- excel - Excel VBA 无模式启动用户窗体,然后进入模态
- go - 大猩猩会话值存储在哪里?
- ios - IOS 应用程序在设备上显示为灰色框
- php - Gmail 应用程序剥离等于登录 Mailto 正文
- ios - 如何在集合视图中动态添加按钮并从用户输入动态命名(Swift 4)?
- ffmpeg - FFMPEG 更改音频和字幕的 fps 并合并 2 个文件
- robotframework - 如何知道是否在重复关键字的最后重复
- sharepoint - 使用基于条件的数据创建自定义列表视图,并从列表视图 webpart 使用 JSLink 客户端渲染禁用 oob 过滤器
- redirect - 将 URL 重定向到主页时,TestCafe 挂起
- python - 在python中的多个数值变量上绘制分类变量