2

在我的项目Mockito.times(1)中验证模拟时经常使用:

verify(mock, times(1)).call();

这是多余的,因为 Mockito 使用隐式times(1)for verify(Object),因此以下代码与上面的代码完全相同:

verify(mock).call();

所以我要写一个结构搜索驱动检查来报告这种情况(比如说,命名为Mockito.times(1) 是多余的)。由于我不是 IntelliJ IDEA 结构搜索方面的专家,所以我的第一次尝试是:

Mockito.times(1)

显然,这不是一个好的搜索模板,因为它忽略了调用站点。比方说,我发现它对以下代码很有用,我不希望触发检查:

VerificationMode times = Mockito.times(1);
                      // ^ unwanted "Mockito.times(1) is redundant"

所以现在我想定义我希望触发检查的上下文。现在检查搜索模板变为:

Mockito.verify($mock$, Mockito.times(1))

伟大的!现在verify(mock, times(1)).call()报告的代码很好(如果times是从静态导入的org.mockito.Mockito)。但还有一件事。Mockito.times实际上来自对VerificationModeFactory此类验证模式进行分组的类,因此检查忽略了以下行:

verify(mockSupplier, VerificationModeFactory.times(1)).get();

我修复这个问题的另一种尝试是:

Mockito.verify($mock$, $times$(1))

在哪里:

  • $mock$仍然是默认模板变量;
  • $times$是一个变量,其中Text/regexp设置为timesWhole words onlyValue is read设置为true,并且Expression type (regexp)设置为(Times|VerificationMode)- 至少这是我认为它应该工作的方式。

不能让它工作。为什么Times也包含在正则表达式中?这是 的真正实现*.times(int),因此,理想情况下,也应该报告以下行:

verify(mockSupplier, new Times(1)).get();

当然,我可以创建所有三个检查模板,但是是否可以使用单个搜索模板创建这样的模板?配置$times$变量时我缺少什么?

(我使用的是 IntelliJ IDEA 社区版 2016.1.1)

4

1 回答 1

1

尝试以下搜索查询:
Mockito.verify($mock$, $Qualifier$.times(1))

使用$Qualifier$text/regexpVerificationModeFactory|Mockito和出现次数 0,1(在静态导入时也可以找到它)。

要匹配new Times(1),您可以使用以下查询:
Mockito.verify($mock$, $times$)

使用$times$text/regexp.*times\s*\(\s*1\s*\)并取消选中该Case sensitive复选框。

于 2016-09-22T11:13:44.727 回答