java - 如何使用可变参数模拟方法?
问题描述
我想要一个带有可变参数的方法,但它不起作用,因为该方法仍然被调用。我已经尝试了以下但没有成功:
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);
}
}
解决方案
问题是您创建的模拟与projImpl
.
同样@MockBean
是弹簧注释,而不是mockito
注释,对您的用例没有任何作用。
您可以使用spy
onProjetoServiceImpl
代替,但是有些人会建议您应该重构代码。将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()
推荐阅读
- git - 如何安全地从 git repo 中删除新文件
- javascript - 为什么 JavaScript 会继续打印语法错误,而不是在我的终端中打印更早的类型错误?
- sql-server - 在 SQL 中对 GPS 坐标进行排序
- security - 使用 OWASP ZAP 的移动应用安全测试
- hibernate - 重复的唯一主键错误 Teradata - Hibernate
- spring - Spring Gateway 和 Auth0:IllegalArgumentException:找不到名称为 TokenRelay 的 GatewayFilterFactory
- php - 按 wordpress 编号列出帖子
- android - 如何使用 Facebook SDK 以编程方式跟踪给定用户 ID 的应用安装源?
- android - React-Native 选项卡导航栏被切断
- laravel - 无法通过 Laravel 插入多个 INSERT 查询