如何编写一个健壮的结构搜索模板来报告 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))
其中:
$mock$
仍然是一个默认的模板变量;
$times$
是 Text/regexp 设置为 times
的变量, 仅整词 并且 Value is read 被设置为 true
,并且 Expression type (regexp)
被设置为 (Times|VerificationMode)
——至少这是我认为它应该工作的方式.
无法正常工作。为什么 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
复选框。
在我的项目中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))
其中:
$mock$
仍然是一个默认的模板变量;$times$
是 Text/regexp 设置为times
的变量, 仅整词 并且 Value is read 被设置为true
,并且Expression type (regexp)
被设置为(Times|VerificationMode)
——至少这是我认为它应该工作的方式.
无法正常工作。为什么 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
复选框。