如何使用Mockito模拟Context?

39

我正在使用Context访问系统级服务,如WifiManager和BluetoothManager。如何使用Mockito模拟getApplicationContext()方法?

4个回答

42
    Context context = mock(Context.class);

1
看起来在较新版本的Mockito中它不起作用。Mockito禁止模拟具有复杂合同或可以通过其他方式轻松构造的类型。它会抛出异常“'context'正在模拟'class android.content.Context'。不要模拟Android组件,因为它们具有大量状态和复杂行为-使用真实的东西。在Robolectric测试中,可以从ApplicationProvider.getApplicationContext()获取Context,在模拟器测试中可以从InstrumentationRegistry获取。 - Farruh Habibullaev

26

如果你想使用 KotlinMockito 来获取上下文,可以按照以下方式进行:

mock(Context::class.java)

9

35
你能在你的回答中再加入一点内容吗? - Brill Pappin
更多信息请参见:https://dev59.com/nVMI5IYBdhLWcg3wir6J#57296849 - Daniele Ceglia
一点帮助都没有 - EPAgg

0
不要嘲笑你不拥有的类型。为什么呢?假设你在嘲笑一个第三方库,如果该库的维护者进行了更改,那么你的测试将会被执行,因为它是一个模拟对象,你认为一切都没问题,但实际上并非如此,因为有些变化你并不知道,情况可能会变得很糟糕。

这就是集成测试的用途。模拟对象用于表达“假设这个被模拟的对象以这种方式行为,我的系统是否按预期工作?”实际上,你的论点也适用于你自己的代码。如果代码发生变化,你的模拟对象并不一定会改变,从而产生同样的问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接