Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito-应为0个匹配器,记录了2个(InvalidUseOfMatchersException)_Java_Exception_Mocking_Mockito - Fatal编程技术网

Java Mockito-应为0个匹配器,记录了2个(InvalidUseOfMatchersException)

Java Mockito-应为0个匹配器,记录了2个(InvalidUseOfMatchersException),java,exception,mocking,mockito,Java,Exception,Mocking,Mockito,对于类似的查询,我参考了Stackoverflow上的所有可用资源。但我不确定这个测试的问题是什么: 它正在抛出以下异常 [main] ERROR com.example.dao.spring.TransactionDAOSpring - org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!0 matchers expected, 2 recorded.

对于类似的查询,我参考了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());
    }
更新:调试后,它似乎无法从数据源获取连接,因此引发异常

[main] ERROR com.example.dao.spring.TransactionDAOSpring - org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!0 matchers expected, 2 recorded.
任何帮助都将不胜感激。

像anyString或anyLong这样的匹配器可以用于模拟对象,例如在when或verify调用中。就你而言:

 Map<String, Object> returnedResultMap = transactionDAOSpring.retrieve(
                                                           anyString(), anyLong());

是真正的方法调用。我认为这就是导致Matchers异常无效使用的原因。尝试使用诸如空字符串和0L之类的存根值调用您的方法。您可以显示静态导入以及变量的定义吗?您使用哪个版本的Mockito?您是否注意到弃用说明,请参阅仅使用ArgumentMatchers.anyMap是否会改变任何内容?我刚刚尝试过,但这两种方法在2.8版本中都很好。我使用的是Mockito 1.9.0 jar。它无法识别ArgumentMatchers.anyMap这是正确的,因此,这将向堆栈中添加两个匹配器。除非调用validateMockitoUsage或使用MockitoJUnitRunner或MockitoRule,否则Mockito无法立即检测到这一点,因此它通常会导致套件中的其他测试失败。