java.lang.NullPointerException:无法为null ShadowPreferenceManager获取阴影

时间:2014-12-08 05:14:59

标签: java android unit-testing nullpointerexception mockito

有人可以帮我理解如何修复此异常吗?

我引用Robolectric tests fail on shadowOf但我已经使用this访问SharedPreferences,即

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class SomeClassTest {

    private Context context;
    private SomeClassTest someClassTest;
    private SharedPreferences sharedPreferences;

    @Before
    public void setup() throws Exception {
        context = mock(Context.class);
        sharedPreferences = ShadowPreferenceManager.getDefaultSharedPreferences(context);
        someClassTest = new SomeClassTest(context);
    }

    @Test
    public void someClassProduction() {
        when(someClassTest.getEnvironment()).thenReturn("PRODUCTION");
        when(someClassTest.getBaseUrl()).thenReturn("https://www.someUrl.com/v1/");
        assertTrue(someclassTest.getTestUrl().equals("https://www.someurl.com/v1/counts.json")
    }
}
java.lang.NullPointerException: can't get a shadow for null
    at org.robolectric.bytecode.ShadowWrangler.shadowOf(ShadowWrangler.java:442)
    at org.robolectric.Robolectric.shadowOf_(Robolectric.java:1059)
    at org.robolectric.Robolectric.shadowOf(Robolectric.java:477)
    at org.robolectric.shadows.ShadowPreferenceManager.getDefaultSharedPreferences(ShadowPreferenceManager.java:21)
    at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java)

1 个答案:

答案 0 :(得分:1)

原来,我必须用context = mock(Context.class)

替换context = Robolectric.application

这是更新后的测试:

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class SomeClassTest {

    private Context context;
    private SomeClassTest someClassTest;
    private SharedPreferences sharedPreferences;

    @Before
    public void setup() throws Exception {
        context = Roboelectric.application;
        sharedPreferences = ShadowPreferenceManager.getDefaultSharedPreferences(context);
        someClassTest = new SomeClassTest(context);
    }

    @Test
    public void someClassProduction() {
        when(someClassTest.getEnvironment()).thenReturn("PRODUCTION");
        when(someClassTest.getBaseUrl()).thenReturn("https://www.someUrl.com/v1/");
        assertTrue(someclassTest.getTestUrl().equals("https://www.someurl.com/v1/counts.json")
    }
}