提问者:小点点

我如何编写一个健壮的结构搜索模板来报告在IntelliJ IDEA中通过验证的Mockito次数(1)/次数(1次)?


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

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

这是多余的,因为Mockito使用隐式<code>times(1)</code>进行<code>verify(Object)</code>,因此下面的代码与上面的代码完全相同:

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()这样的代码被报告得很好(如果时间是从org.mockito.Mockito静态导入的)。但也有一件事。Mockito.times实际上来自其VerificationModeFactory类,其中此类验证模式被分组,因此检查会忽略以下行:

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

我解决这个问题的另一个尝试是这样的:

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

哪里:

  • $mock$ 仍然是默认模板变量;
  • $times$ 是一个变量,其中文本/正则表达式设置为 time,仅全字和值读取设置为 true表达式类型 (regexp) 设置为 (Times|验证模式) - 至少这是我认为它应该工作的方式。

不能让它工作。为什么< code>Times也包含在regexp中?这是< code>*的真正实现。times(int),所以,理想情况下,也应该报告下面一行:

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

当然,我可以创建所有三个检查模板,但是是否可以使用单个搜索模板来创建这样一个模板?在配置< code>$times$变量时,我遗漏了什么?

(我正在使用 IntelliJ IDEA 社区版 2016.1.1)


共1个答案

匿名用户

尝试以下搜索查询:
Mockito.核实($mock$,$Qualifier$. time(1))

with < code > $ Qualifier $ text/regexp < code > VerificationModeFactory | mock ITO 且出现次数计数为0,1(也在静态导入时查找)。

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

使用 $times$ 文本/正则表达式 .*times\s*\(\s*1\s*\) 并取消选中区分大小写复选框。