首页 > 解决方案 > 如何使用可变参数模拟方法?

问题描述

我想要一个带有可变参数的方法,但它不起作用,因为该方法仍然被调用。我已经尝试了以下但没有成功:

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);
   }
}

标签: javamockito

解决方案


问题是您创建的模拟与projImpl.

同样@MockBean是弹簧注释,而不是mockito注释,对您的用例没有任何作用。

您可以使用spyonProjetoServiceImpl代替,但是有些人会建议您应该重构代码。将buscarTodos方法移至某些依赖项并模拟这是一个可行的选择..

当您使用 a 时,测试看起来像这样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()


推荐阅读