android - 单元测试中的 Android ArraySet 未被模拟
问题描述
在代码中使用android.util.ArraySet
时,我无法在非 android 测试类中测试使用它的类,因为它会引发异常:
java.lang.RuntimeException:在 android.util.ArraySet 中添加的方法未模拟。有关详细信息,请参阅http://g.co/androidstudio/not-mocked。
链接说:
这是为了确保您的单元测试只测试您的代码,而不依赖于 Android 平台的任何特定行为(您没有明确地模拟,例如使用 Mockito)
如何使用 ArraySet 对代码进行单元测试?我会说以某种方式“用 HashSet 替换它”来模拟(Mockito,PowerMock)它可能是有希望的:
要测试的代码:
Set<Bird> birds = new ArraySet<>();
birds.add(currentBird);
测试代码:
whenNew(ArraySet.class).withAnyArguments().thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return new HashSet();
}
});
这给了java.lang.ClassCastException: java.util.HashSet cannot be cast to android.util.ArraySet
.
一种解决方法是不返回 aHashSet
但一些MyFakeArraySet extends ArraySet
(内部使用 a HashSet
),但遗憾ArraySet
的是final
. :-(
解决方案
我发现测试文件夹中的类似乎具有优先权。所以我不必嘲笑任何东西。我可以将一个包android.util
放入我的测试文件夹和一个ArraySet
完全由我指定的类:
package android.util;
import android.support.annotation.NonNull;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class ArraySet<E extends Object> implements Collection<E>, Set<E> {
private final HashSet<E> HASH_SET;
public ArraySet(int capacity) {
Log.e("ArraySet", "WARNING, using fake array set!");
HASH_SET = new HashSet<>(capacity);
}
@Override
public int size() {
return HASH_SET.size();
}
// Do this with all other methods as well: Chain them into HASH_SET.
}
推荐阅读
- python - 在 Print() 中使用数学进行 Python 格式化
- arrays - Perl:如何遍历多个对象中的数组并从 web 服务中提取值
- python - Python Pandas:搜索具有连续条件的行
- c# - c# 没有客户端证书的 TLS 客户端
- javascript - 通过 JavaScript 输出文本的问题
- javascript - 如何使用 Lodash 对 JSON 数据进行子级过滤
- powershell - 使用任意键退出 Do-Until 循环
- django - 如何使特定模型字段从另一个模型动态化
- python - 在没有 Pandas 的情况下制作频率表时值不正确
- sql - 使用 regex 和 hive sql 在每 7 个字符后插入逗号