java - 为 Android 单元测试模拟 WifiManager

标签 java android unit-testing junit mocking

我正在尝试为几个依赖 WifiManager 和返回的 ScanResults 的类实现一些单元测试。我想要做的是能够控制我收到的 ScanResults,以便测试各种不同的条件。

不幸的是,我很难成功模拟 WifiManager(尽管我想我可以在我的 MockWifiManager 中传递它的构造函数空引用)。这将只是我的第一个问题,因为一旦我有一个 MockWifiManager 可以玩(如果它能工作!)我将必须成功创建我的测试 ScanResults,它没有公共(public)构造函数(想象它是由某个地方的某个工厂创建的)。

问题: 如果它没有公共(public)构造函数,我什至可以扩展它吗?

我是不是做错了?我经常被问到关于如何完成特定任务的问题,但实际上他们试图以错误的方式解决不同的问题,也许这就是我在这里所做的?

我是 android 的新手,所以至少要模拟所有这些功能一直在努力。

感谢您的投入!

编辑: 我也很难实例化 MockWifiManager。 wifi 管理器的构造函数期望 IWifiManager 是一种在 Android SDK 中似乎不存在的类型。

最佳答案

围绕 WifiManager 创建一个抽象。用这个来 mock 你。 mock 你不拥有的东西是坚硬而脆弱的。如果做得好,您应该能够切换内部结构,而且您最终会得到一个更好的可模拟 API。

对于您的测试,您可以对经理进行 stub /伪造,让您心满意足。对于生产,您将传递一个具体实例。

关于您关于更改代码只是为了使其可测试的观点是不正确的。首先,您应该模拟角色而不是类型,如下文所述。谷歌了解更多信息。

其次,围绕第三方代码创建抽象是 SOLID 中依赖倒置原则所述的最佳实践。无论您是否进行单元测试,您都应该始终依赖于抽象而不是具体的实现。

http://www.objectmentor.com/resources/articles/dip.pdf http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

关于java - 为 Android 单元测试模拟 WifiManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5560451/

相关文章:

android - Android 上的共享库 : String assignments (=) to struct values cause segfault (dlfree)

java - 类的模拟在 Spock 测试用例中不起作用

带有 HTTP 上传的 Java ProgressBar 不更新

java - 无需调整应用程序大小即可显示 Swing 组件

java - 如何使用 Jsoup 通过 HTTPS 连接?

c# - 如何验证 Moq 中的对象类型参数

unit-testing - 将单元测试用例的 Private 方法更改为 Public 是一个很好的做法

java.lang.UnsatisfiedLinkError : no opencv_java2411 in java. 库路径

Java Eclipse 启动问题

android - ProgressBar 高度=match_parent