【问题标题】:java.lang.NullPointerException: can't get a shadow for null ShadowPreferenceManagerjava.lang.NullPointerException:无法为 null ShadowPreferenceManager 获取阴影
【发布时间】:2014-12-08 05:14:59
【问题描述】:

有人可以帮助我了解如何解决此异常吗?

我引用了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)

【问题讨论】:

  • 我们遗漏了一些重要信息:哪个引用是 null ?您能否在调用“getDefaultSharedPreferences(...)”之前检查“context”的值以确保您的“mock(...)”方法正常工作?
  • 知道了,@bdulac 我调试了失败的测试 - 上下文不为空。

标签: java android unit-testing nullpointerexception mockito


【解决方案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")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多