如何编写一个健壮的结构搜索模板来报告 Mockito times(1)/Times(1) 在 IntelliJ IDEA 中传递给验证?

How do I write a robust structural search template to report Mockito times(1)/Times(1) passed to verify in IntelliJ IDEA?

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

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

这是多余的,因为 Mockito 使用隐式 times(1) 作为 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 class,其中对此类验证模式进行了分组,因此检查忽略了以下行:

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

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

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

其中:

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

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

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

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

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

使用 $Qualifier$ text/regexp VerificationModeFactory|Mockito 并且出现次数为 0,1(静态导入时也能找到它)。

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

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