【问题标题】:How can I mock a method with varargs arguments?如何使用可变参数模拟方法?
【发布时间】:2019-12-22 02:08:39
【问题描述】:

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

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

【问题讨论】:

  • 检查我的答案here。如果您的实现未传递参数,您可能需要将参数与空的Object[] 匹配。
  • String... equivale à String[].... 我的意思是,String... 相当于String[],你可以尝试传递一个空数组甚至null,比如...projectServiceMock.buscarTodos(new String[0])).then...
  • 我已经尝试了所有建议,包括如何在 Mockito 链接中正确匹配可变参数,但我没有成功。还有其他建议吗?
  • 请提供minimal reproducible example。真正的方法在哪里被调用,那里实际使用了哪些参数?另外,如果您说它不起作用,您到底指的是什么?

标签: java mockito


【解决方案1】:

问题是您创建的模拟与projImpl 无关。

另外,@MockBean 是一个 spring 注释,而不是 mockito 注释,对您的用例没有任何作用。

您可以在ProjetoServiceImpl 上使用spy,但是有些人会建议您重构代码。将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);
}

另一个替代(和更清洁)的解决方案可能是您在 buscarTodos 的实现中模拟 defaultRepository,这可以在您之前在问题中的代码示例中看到。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2022-09-24
    • 2016-09-21
    相关资源
    最近更新 更多