我有一个更干净的测试问题:我有一个SearchObject
,它的属性对应于mongodb中的字段。SearchObject
需要转换为mongodb查询以进行搜索。由于我们使用的是spring data mongodb,首先SearchObject
被转换为Criteria
的列表以进行搜索。这是在一个单独的类中完成的,它有如下函数(显示一个非常简单的例子):
private static String beginsWith(String match) { return "^" + Pattern.quote(match); }
public Criteria buildNameCriteria(SearchObject searchObject) {
if (StringUtils.isEmpty(searchObject.getName())) {
return new Criteria();
}
return Criteria.where("name").regex(beginsWith(searchObject.getName()), "im");
}
现在,为这样的方法编写单元测试的最佳方法是什么?
- 是否将Criteria转换为Json并将其与预定义值进行比较?(这很容易在更新spring数据mongodb时中断)
- 从标准中提取正则表达式并检查它是否正确?
- 模拟Criteria方法并检查它们是否已被调用?
有没有办法测试这样的方法?或者代码应该被重构以允许更容易的测试?请记住,显示的代码只是一个例子,实际的标准通常更复杂。
1条答案
按热度按时间gab6jxml1#
我假设您希望测试条件是否按照您的预期进行,并且对
Criteria
的内部工作或生成的实际正则表达式不感兴趣。所以我建议用一个SearchObject来设置测试数据:应该和不应该找到的文件。确保尽可能多地包括角落案例;可能会要求工程师同事提出一些极端情况。
将测试文档放入一个测试数据库中,看看SearchObject是否找到了它应该找到的那些文档。
模拟数据库还是真实的数据库?看情况。
编写mock可能会花费太多的精力,而且它在MongoDB驱动程序中的变化也会有些脆弱。
在真实的的DB中运行取决于是否有测试环境、与生产环境的差异有多大以及这些差异对代码的影响有多大。