我正在尝试为几个依赖 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/