模拟WifiManager进行Android单元测试

Bri*_*ian 5 java junit android unit-testing mocking

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

不幸的是,我很难成功模拟WifiManager(虽然我想我可以在我的MockWifiManager中传递它的构造函数空引用).这只是我的第一个问题,因为我有一个MockWifiManager可以玩(如果这甚至可以工作!)我将不得不成功创建我的测试ScanResults,它没有公共构造函数(想象一下它是由某个工厂创建的).

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

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

我对android很新,所以不得不模拟所有这些功能一直试图说.

感谢您的投入!

编辑:我还有一段时间来实例化一个MockWifiManager.wifi管理器的构造函数期望IWifiManager是Android SDK中似乎不存在的类型.

Fin*_*las 9

围绕WifiManager创建一个抽象.用它来嘲笑你.嘲弄你不拥有的东西是硬而脆的.如果做得对,你应该能够切换内部,再加上你最终会得到一个更好的可模拟API.

对于您的测试,您可以根据心脏内容存根/伪造经理.对于生产,您将传递一个具体的实例.

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

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

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