共享首选项在 mockito 中为 null
Shared Preferences is null in mockito
我正在尝试使用 Mockito 模拟一个简单的共享首选项。由于 google 上的示例太复杂,无法从中提取任何内容,因此我决定自己继续。
共享首选项是使用匕首设置的。
它在 SharedPreferenceManager class 的 saveString 方法中与 NPE 在 putString 行上崩溃。
@Module
public class StudentModule {
@Provides
@Singleton
static Context getContext(Application application) {
return application.getApplicationContext();
}
@Provides
@Singleton
static SharedPreferences getSharedPreferences(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
}
有一位经理class:
public class SharedPreferenceManager {
private SharedPreferences sharedPreferences;
private Context context;
@Inject public SharedPreferenceManager(SharedPreferences sharedPreferences, Context context){
this.sharedPreferences=sharedPreferences;
this.context=context;
}
public String doSomething(){
return sharedPreferences.getString("s","");
}
public void saveString(String s){
System.out.println(sharedPreferences.getClass().getSimpleName());
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("s","bis").apply();
}
}
这是测试:
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@InjectMocks
SharedPreferenceManager sharedPreferenceManager;
@Mock SharedPreferences sharedPreferences;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void isSharedPefWorking(){
sharedPreferenceManager.saveString("bis");
assertEquals("bis",sharedPreferenceManager.doSomething());
}
}
SharedPreferences
使用了一个 SharedPreferences.Editor
,你目前没有在模拟它。
您需要执行类似以下操作来模拟和验证您的 SharedPreferenceManager
.
的行为
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@InjectMocks
SharedPreferenceManager sharedPreferenceManager;
@Mock
SharedPreferences sharedPreferences;
@Mock
SharedPreferences.Editor sharedPreferencesEditor;
final String savedString = "savedString";
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
when(sharedPreferences.edit()).thenReturn(sharedPreferencesEditor);
when(sharedPreferencesEditor.putString(anyString(), anyString())).thenReturn(sharedPreferencesEditor);
}
@Test
public void saveString() {
sharedPreferenceManager.saveString(savedString);
verify(sharedPreferencesEditor).putString("s", savedString);
}
@Test
public void getString() {
when(sharedPreferences.getString("s","")).thenReturn(savedString);
String preferenceString = sharedPreferenceManager.doSomething();
assertEquals(preferenceString, savedString);
}
}
我正在尝试使用 Mockito 模拟一个简单的共享首选项。由于 google 上的示例太复杂,无法从中提取任何内容,因此我决定自己继续。 共享首选项是使用匕首设置的。 它在 SharedPreferenceManager class 的 saveString 方法中与 NPE 在 putString 行上崩溃。
@Module
public class StudentModule {
@Provides
@Singleton
static Context getContext(Application application) {
return application.getApplicationContext();
}
@Provides
@Singleton
static SharedPreferences getSharedPreferences(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
}
有一位经理class:
public class SharedPreferenceManager {
private SharedPreferences sharedPreferences;
private Context context;
@Inject public SharedPreferenceManager(SharedPreferences sharedPreferences, Context context){
this.sharedPreferences=sharedPreferences;
this.context=context;
}
public String doSomething(){
return sharedPreferences.getString("s","");
}
public void saveString(String s){
System.out.println(sharedPreferences.getClass().getSimpleName());
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("s","bis").apply();
}
}
这是测试:
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@InjectMocks
SharedPreferenceManager sharedPreferenceManager;
@Mock SharedPreferences sharedPreferences;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void isSharedPefWorking(){
sharedPreferenceManager.saveString("bis");
assertEquals("bis",sharedPreferenceManager.doSomething());
}
}
SharedPreferences
使用了一个 SharedPreferences.Editor
,你目前没有在模拟它。
您需要执行类似以下操作来模拟和验证您的 SharedPreferenceManager
.
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@InjectMocks
SharedPreferenceManager sharedPreferenceManager;
@Mock
SharedPreferences sharedPreferences;
@Mock
SharedPreferences.Editor sharedPreferencesEditor;
final String savedString = "savedString";
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
when(sharedPreferences.edit()).thenReturn(sharedPreferencesEditor);
when(sharedPreferencesEditor.putString(anyString(), anyString())).thenReturn(sharedPreferencesEditor);
}
@Test
public void saveString() {
sharedPreferenceManager.saveString(savedString);
verify(sharedPreferencesEditor).putString("s", savedString);
}
@Test
public void getString() {
when(sharedPreferences.getString("s","")).thenReturn(savedString);
String preferenceString = sharedPreferenceManager.doSomething();
assertEquals(preferenceString, savedString);
}
}