参数匹配器的使用无效

Anw*_*war 15 java mockito

下面的简单测试用例失败,但有例外.

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers! 3 matchers expected, 2 recorded:
Run Code Online (Sandbox Code Playgroud)

我不确定是什么问题

@Test
public void testGetStringTest(){

    final long testId = 1;
    String dlrBAC = null;
    NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
    when(this.dao.getNamedParameterJdbcTemplate()).thenReturn(jdbcTemplate);
    when(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), String.class
                        )).thenReturn("Test");
    dlrBAC =  dao.getStringTest(testId);
    assertNotNull(dlrBAC);

}
Run Code Online (Sandbox Code Playgroud)

mac*_*ias 42

Mockito要求您在使用方法调用时仅使用原始值或仅使用匹配器.完整的例外(这里没有发布)肯定会解释一切.

简单改变一下:

when(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), String.class
                        )).thenReturn("Test");
Run Code Online (Sandbox Code Playgroud)

when(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(String.class)
                        )).thenReturn("Test");
Run Code Online (Sandbox Code Playgroud)

它应该工作.

  • 非常老的帖子,但对于最终来到这里的 Scala 程序员(比如我自己),你会发现添加 `import org.mockito.Mockito._` 然后调用 `eq(classOf[String])` 不会工作。解决方案是使用“eq()”函数的完整路径:“org.mockito.Matchers.eq(classOf[String]))”,如[此处](/sf/answers/2066711181/所述) /5420229)。 (3认同)
  • 添加`import static org.mockito.Mockito.*;` (2认同)
  • 希望我的理解是正确的:如果您对任何 1 个参数使用任何匹配器,那么您需要对所有其他参数以及方法使用匹配器,或者根本不使用匹配器并传递实际值/对象。 (2认同)