我想要一个带有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);
}
}
答案 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()
)。