我有一个需要几个参数的方法.其中之一是某个类的 List,null 是该参数的可接受值.
I have a method that takes a few parameters. One of them is a List of some class, and null is an acceptable value for this parameter.
public void doStuff(String string, @Nullable List<SomeClass> list) {
...
}
我想编写一个测试,使用 Mockito 来验证该方法是否以 null 作为参数调用.我尝试使用 isNull(List.class):
I want to write a test that uses Mockito to verify the method was called with null as a parameter. I tried using isNull(List.class):
MyClass myClass = ...
verify(myClass).doStuff(any(String.class), isNull(List.class));
但这会产生警告:
未经检查的转换
需要:java.util.List
com.package.SomeClass>
找到:java.util.List
unchecked conversion
required: java.util.List< com.package.SomeClass>
found: java.util.List
如果列表不为空,我可以看到如何修复此警告:
I can see how to fix this warning in the event that the list is not null:
// this generates the same warning
verify(myClass).doStuff(any(String.class), any(List.class));
// this does not generate the warning
verify(myClass).doStuff(any(String.class), Matchers.anyListOf(SomeClass.class)));
但是,我似乎找不到将这两种方法结合在一起的方法.或者找到一种替代方法来完成我想做的事情.(除了用注释来抑制警告)
However, I can't seem to find a way to combine these two approaches together. Or find an alternate approach that accomplishes what I am trying to do. (Other than suppressing the warning with an annotation)
一般的答案是使用显式的泛型方法参数.
The general answer is to use an explicit generic method argument.
verify(myClass).doStuff(any(String.class), Matchers.<List<SomeClass>>isNull());
补充说明:
null 是 null,并且通过类型擦除,所有这些形式都将编译为相同的字节码.isNull() 就足够了.org.mockito.Matchers,而 Mockito 2.x 弃用该类以支持 org.mockito.ArgumentMatchers.在这两种情况下,匹配器方法都可以通过 org.mockito.Mockito 看到,但 static-methods-via-inheritance 在语义上很弱,可能会导致这些方法不显示在 IDE 中.如果没有将 Matchers 作为静态参数,则无法指定 <List<SomeClass>>isNull().你可以做什么,如果你需要做很多,就是提取一个本地静态方法......
null is null, and with type erasure all of these forms will compile to the same bytecode anyway.isNull() is sufficient there without cleverness.org.mockito.Matchers whereas Mockito 2.x deprecates that class in favor of org.mockito.ArgumentMatchers. In both cases the matcher methods are visible through org.mockito.Mockito, but static-methods-via-inheritance is semantically weak and can cause those methods not to show up in IDEs.There's no way to specify <List<SomeClass>>isNull() without the Matchers as a static argument. What you can do, if you need to do this a lot, is to extract a local static method...
private static List<SomeClass> nullSomeClassList() {
return isNull(); // Return value types can be inferred before Java 8.
}
// elsewhere
verify(myClass).doStuff(any(String.class), nullSomeClassList());
...但无论你做什么,不要提取到字段.副作用在这里很重要.
...but whatever you do, don't extract to a field instead. The side effects are what matters here.
这篇关于使用 Mockito 匹配特定类型的空列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
如何检测 32 位 int 上的整数溢出?How can I detect integer overflow on 32 bits int?(如何检测 32 位 int 上的整数溢出?)
return 语句之前的局部变量,这有关系吗?Local variables before return statements, does it matter?(return 语句之前的局部变量,这有关系吗?)
如何将整数转换为整数?How to convert Integer to int?(如何将整数转换为整数?)
如何在给定范围内创建一个随机打乱数字的 intHow do I create an int array with randomly shuffled numbers in a given range(如何在给定范围内创建一个随机打乱数字的 int 数组)
java的行为不一致==Inconsistent behavior on java#39;s ==(java的行为不一致==)
为什么 Java 能够将 0xff000000 存储为 int?Why is Java able to store 0xff000000 as an int?(为什么 Java 能够将 0xff000000 存储为 int?)