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
实例,而在我的mock
context
上直接调用
getSharedReferences
返回我的mock
SharedReferences
实例?

基于此文档()并逐行调试代码,我得出的关于为什么会发生这种情况的结论是,gradle中用于单元测试的android代码实际上只是一个shell,在每次方法调用时都返回存根值,因此自然地,这导致我假设
PreferenceManager.getDefaultSharedReferences()的代码在我的单元测试中使用的
或多或少是
返回null

,因此您需要模拟对
首选项管理器.getDefaultSharedReferences(context)
的静态调用。这在mockito目前是不可能的,仍然存在


一个解决方案显示在的已接受答案中,您可以检查或作为备选方案

您是否检查了
首选项管理器的代码。GetDefaultSharedReferences(context)
?PM如何从
上下文中获取数据?`返回context.getSharedReferences(getDefaultSharedReferencesName(context),getDefaultSharedReferencesMode())``