【发布时间】:2016-10-13 23:47:11
【问题描述】:
我有一个需要几个参数的方法。其中之一是某个类的 List,null 是该参数的可接受值。
public void doStuff(String string, @Nullable List<SomeClass> list) {
...
}
我想编写一个测试,使用 Mockito 来验证该方法是否以 null 作为参数调用。我尝试使用isNull(List.class):
MyClass myClass = ...
verify(myClass).doStuff(any(String.class), isNull(List.class));
但这会产生警告:
未经检查的转换
需要:java.util.List
找到:java.util.List
如果列表不为空,我可以看到如何修复此警告:
// 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)));
但是,我似乎找不到将这两种方法结合在一起的方法。或者找到一种替代方法来完成我想做的事情。 (除了用注释来抑制警告)
【问题讨论】:
-
为什么
null列表永远是可接受的参数?不使用空列表的原因是什么? -
我同意这远非理想的设计决策。实际的方法要复杂得多,并且接受一长串可选参数。与其强迫某人创建十几个空列表,不如决定让他们通过 null 代替。当然,拥有多个方法或实现某种构建器或工厂会更有意义,但它是一个 Android 库,重点放在保持 APK 大小和 dex 数量低而不是可用性上。我很想在将来清理它,但现在这是我必须处理的。
-
但是你现在需要一些时间来解决你的问题!为什么不使用它来重构此方法而不是尝试使模拟工作?我认为这完全值得花时间。顺便说一句,写
Collections.emptyList()而不是null没什么大不了的? -
这是一个已经被多个客户端使用的API方法。如果不破坏已发布的应用程序,我无法删除它。但我确实想为它编写测试。
标签: java unit-testing mockito