2017-02-12 154 views
2

我所得到的是这一行:验证的Mockito参数包含另一个字符串忽略大小写

verify(mockAppendable).append(org.mockito.Mockito.contains(msg)); 

...但我想这个测试是区分无动于衷。我会怎么做?

+1

使用argThat,例如:https://static.javadoc.io/org.mockito/mockito-core/2.7.5/org/mockito/ArgumentMatchers.html#argThat(org.mockito.ArgumentMatcher) –

+0

谢谢。我想知道是否有可能做到这一点作为一个班轮,与Java 8拉姆达,按照这个页面,你的链接指向:https://static.javadoc.io/org.mockito/mockito-core/2.7 0.5 /组织/的Mockito/ArgumentMatcher.html –

回答

1

the page,它们是什么意思,“你可以提取方法”,它有可能使用Java 8 lambda使这是一个单线程?

在使用情况下不敏感代码从here一行:

verify(mockAppendable) 
    .append(
     argThat(arg -> 
     Pattern.compile(Pattern.quote(msg), Pattern.CASE_INSENSITIVE).matcher(arg).find())); 

所以他们通过跳过指定自定义错误消息所允许的拉姆达版本。

并以“你可以提取的方法”,他们的意思是:

verify(mockAppendable).append(argThat(containsCaseInsensitive(msg))); 

而且方法定义为:

public static ArgumentMatcher<String> containsCaseInsensitive(final string s) { 
    if (s == null) throw new IllegalArgumentException("s is null"); 
    final Pattern pattern = Pattern.compile(Pattern.quote(s), Pattern.CASE_INSENSITIVE); 
    return new ArgumentMatcher<String>() { 

     @Override 
     public boolean matches(String arg) { 
      return arg != null && pattern.matcher(arg).find(); 
     } 

     @Override 
     public String toString() { 
      return String.format("[should have contained, ignoring case, \"%s\"]", s); 
     } 
    }; 
} 

这是完全可重复使用的,你可以把一个新类里就像MocitoMatchers一样,并且可以像任何内置匹配器一样从许多测试中调用。

+0

辉煌。非常感谢! –

+0

你愿意看看我的版本“containsCaseInsensitive”吗?并可能编辑你的? (考虑到空参数略有更好的可读性)......我试图提交修改,但我搞砸了和第三方评审拒绝了... –

+0

你的可能会更完整,但SO不在这里提供复制和粘贴,库质量代码。所有的无效检查和不同的信息都是人们可以选择添加的噪音,只要他们愿意并且不会对问题产生影响。 – weston

0

感谢JB Nizet我已经计算出的答案似乎是这样一类:

class ContainsThisIgnoringCase implements ArgumentMatcher<String> { 
    private String msg; 
    ContainsThisIgnoringCase(String msg){ 
     this.msg = msg; 
    } 
    @Override 
    public boolean matches(String arg) { 
     return arg.toLowerCase().contains(msg.toLowerCase()); 
    } 
    @Override 
    public String toString(){ 
     return msg; 
    } 
} 

不过,我被迷惑的东西,然后我就the page到他的链接指向看:
一)他们怎么​​用“你可以提取方法”和
b)是有可能使用Java 8拉姆达使这一个班轮是什么意思?