Java 模拟默认SharedReferences
因此,我有一个类,它通过构造函数接收Java 模拟默认SharedReferences,java,android,mockito,sharedpreferences,Java,Android,Mockito,Sharedpreferences,因此,我有一个类,它通过构造函数接收上下文,并使用以下方法从中获取默认的共享引用: PreferenceManager.getDefaultSharedPreferences(context) 我正在测试这个类,在我的单元测试中,我编写了以下代码,以在调用getSharedReferences(String,int)时检索模拟的SharedReferences实例: Context context = mock(Context.class); SharedPreferences sharedP
上下文
,并使用以下方法从中获取默认的共享引用
:
PreferenceManager.getDefaultSharedPreferences(context)
我正在测试这个类,在我的单元测试中,我编写了以下代码,以在调用getSharedReferences(String,int)
时检索模拟的SharedReferences
实例:
Context context = mock(Context.class);
SharedPreferences sharedPreferences = mock(SharedPreferences.class);
when(context.getSharedPreferences(anyString(), anyInt()))
.thenReturn(sharedPreferences);
when(sharedPreferences.getString(anyString(), nullable(String.class)))
.thenReturn(tokenManager.getToken());
当我为这个类运行测试时,它以一个null
对象而不是模拟的SharedReferences实例结束。但是,如果我用context.getSharedReferences(“stubbed”,123)
抓取SharedReferences
实例,我最终会得到模拟的SharedReferences
代码
那么为什么
PreferenceManager.getDefaultSharedReferences(context)
返回null
实例,而在我的mockcontext
上直接调用getSharedReferences
返回我的mockSharedReferences
实例?基于此文档()并逐行调试代码,我得出的关于为什么会发生这种情况的结论是,gradle中用于单元测试的android代码实际上只是一个shell,在每次方法调用时都返回存根值,因此自然地,这导致我假设PreferenceManager.getDefaultSharedReferences()的代码在我的单元测试中使用的
或多或少是返回null
,因此您需要模拟对首选项管理器.getDefaultSharedReferences(context)
的静态调用。这在mockito目前是不可能的,仍然存在
一个解决方案显示在的已接受答案中,您可以检查或作为备选方案您是否检查了
首选项管理器的代码。GetDefaultSharedReferences(context)
?PM如何从上下文中获取数据?`返回context.getSharedReferences(getDefaultSharedReferencesName(context),getDefaultSharedReferencesMode())``