我有这个TestNG测试方法代码:

@InjectMocks
private FilmeService filmeService = new FilmeServiceImpl();

@Mock
private FilmeDAO filmeDao;

@BeforeMethod(alwaysRun=true)
public void injectDao() {
    MockitoAnnotations.initMocks(this);
}

//... another tests here

@Test
public void getRandomEnqueteFilmes() {
    @SuppressWarnings("unchecked")
    List<Filme> listaFilmes = mock(List.class);

    when(listaFilmes.get(anyInt())).thenReturn(any(Filme.class));
    when(filmeDao.listAll()).thenReturn(listaFilmes);

    List<Filme> filmes = filmeService.getRandomEnqueteFilmes();

    assertNotNull(filmes, "Lista de filmes retornou vazia");
    assertEquals(filmes.size(), 2, "Lista não retornou com 2 filmes");
}


而且我得到一个“ org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
无效使用参数匹配器!
在此代码的listAll()方法的调用中,预期将包含0个匹配器,其中1个记录:

@Override
public List<Filme> getRandomEnqueteFilmes() {
    int indice1, indice2 = 0;
    List<Filme> filmesExibir = new ArrayList<Filme>();
    List<Filme> filmes = dao.listAll();

    Random randomGenerator = new Random();
    indice1 = randomGenerator.nextInt(5);
    do {
        indice2 = randomGenerator.nextInt(5);
    } while(indice1 == indice2);

    filmesExibir.add(filmes.get(indice1));
    filmesExibir.add(filmes.get(indice2));

    return filmesExibir;
}


我很确定我在这里遗漏了一些东西,但我不知道它是什么!有人帮忙吗?

最佳答案

when(listaFilmes.get(anyInt())).thenReturn(any(Filme.class));


有你的问题。您不能在返回值中使用anyany是一个Matcher,用于匹配参数值以进行存根和验证,对于定义调用的返回值没有意义。您需要显式地返回一个Filme实例,或者将其保留为空(这是默认行为,这会打断存根点)。

我应该注意,使用真实列表而不是模拟列表通常是一个好主意。与您开发的自定义代码不同,List实现是定义良好且经过良好测试的,并且与模拟列表不同,如果您重构被测系统以调用不同的方法,则真正的List不太可能被破坏。这是样式和测试原理的问题,但是您可能会发现仅在此处使用真实的List会很有利。



为什么上述规则会导致该异常?好了,这个解释打破了Mockito的一些抽象,但是matchers don't behave like you think they might -他们将一个值记录到ArgumentMatcher对象的ThreadLocal秘密堆栈中,并返回null或其他一些伪值,并调用whenverify Mockito看到一个非空堆栈,并且知道优先于实际参数值使用那些Matchers。就Mockito和Java评估顺序而言,您的代码如下所示:

when(listaFilmes.get(anyInt())).thenReturn(null);
when(filmeDao.listAll(any())).thenReturn(listaFilmes); // nonsense


自然,Mockito看到一个any匹配器,而listAll不带参数,因此期望有0个匹配器,记录了1个。

关于java - stub 方法时获取InvalidUseOfMatchersException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21738336/

10-12 20:34