如何使用varargs参数模拟方法?

时间:2019-08-15 16:28:49

标签: java mockito

我想要一个带有varargs参数的方法,但由于该方法仍被调用而无法正常工作。 我已经尝试了以下尝试,但没有成功:

ArgumentMatchers.any()

新字符串[] {}

新字符串[0]

但是在所有这些情况下,该方法仍然会被调用。

有我的课:

@Service
public class ProjetoServiceImpl extends DefaultServiceImpl<Projeto,ProjetoRepository> implements ProjetoService { 

  @Override
  public List<Projeto> buscaAtestadosComFiltro(String[] filtros) {
    List<Projeto> projetos = buscarTodos(); // I want to mock this line
    projetos = filtraResultado(projetos, filtros);
    return projetos;
  }
}

///////////////////////////////////////////////// /////

public class ProjetoServiceImplTest { 
    private ProjetoServiceImpl projImpl;
    @MockBean
    private ProjetoService projetoServiceMock;

    @Test
    public void testaBuscaAtestadosComFiltro() {
       Projeto projeto1 = new Projeto();
       List<Projeto> projetos = new ArrayList<Projeto>();
       projetos.add(projeto1);

       when(projetoServiceMock.buscarTodos(ArgumentMatchers.<String>any())).thenReturn(projetos); 

       String[] filtros = new String[] {"java"};
       projImpl = new ProjetoServiceImpl();
       List<Projeto> result = projImpl.buscaAtestadosComFiltro(filtros);
       assertNotNull(result);
   }
}

1 个答案:

答案 0 :(得分:1)

问题在于您创建的模拟与projImpl没有关系。

另外@MockBean是spring注释,而不是mockito注释,对于您的用例不起作用。

您可以在spy上使用ProjetoServiceImpl,但是有些人建议您重构代码。将buscarTodos方法移至某些依赖项并进行模拟是可行的选择。

使用spy时,测试看起来像这样:

@Test
public void testaBuscaAtestadosComFiltro() {
    Projeto projeto1 = new Projeto();
    List<Projeto> projetos = new ArrayList<Projeto>();
    projetos.add(projeto1);

    ProjetoServiceImpl projImpl = new ProjetoServiceImpl();
    ProjetoServiceImpl spy = Mockito.spy(projImpl);

    Mockito.when(spy.buscarTodos(ArgumentMatchers.<String>any())).thenReturn(projetos); 

    String[] filtros = new String[] {"java"};
    List<Projeto> result = spy.buscaAtestadosComFiltro(filtros);
    Assert.assertNotNull(result);
}

另一种(更简洁的)解决方案可能是,您在defaultRepository的实现中模拟buscarTodos,这可以从您先前在问题中遇到的代码示例中看到。

在测试用例中,您需要在调用projetos时提供匹配结果(findAll())。