Use Mockito to match a null list of a specific type(使用 Mockito 匹配特定类型的空列表)
问题描述
我有一个需要几个参数的方法.其中之一是某个类的 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
,并且通过类型擦除,所有这些形式都将编译为相同的字节码. - Java 8 可以从方法参数推断泛型类型,因此
isNull()
就足够了. - Mockito 1.x 调用类
org.mockito.Matchers
,而 Mockito 2.x 弃用该类以支持org.mockito.ArgumentMatchers
.在这两种情况下,匹配器方法都可以通过org.mockito.Mockito
看到,但 static-methods-via-inheritance 在语义上很弱,可能会导致这些方法不显示在 IDE 中. 如果没有将
Matchers
作为静态参数,则无法指定<List<SomeClass>>isNull()
.你可以做什么,如果你需要做很多,就是提取一个本地静态方法......
- In practice, the warning isn't protecting you from anything;
null
isnull
, and with type erasure all of these forms will compile to the same bytecode anyway. - Java 8 can infer generic types from method arguments, so
isNull()
is sufficient there without cleverness. - Mockito 1.x calls the class
org.mockito.Matchers
whereas Mockito 2.x deprecates that class in favor oforg.mockito.ArgumentMatchers
. In both cases the matcher methods are visible throughorg.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 theMatchers
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 匹配特定类型的空列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 Mockito 匹配特定类型的空列表
基础教程推荐
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 降序排序:Java Map 2022-01-01