2014-12-08 75 views
-1

有人可以幫助我理解如何解決此異常?java.lang.NullPointerException:無法獲取陰影爲null ShadowPreferenceManager

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

我們錯過了一些重要的信息:哪些引用是空的?你可以在調用「getDefaultSharedPreferences(...)」之前檢查「context」的值以確保你的「mock(...)」方法正常工作嗎? – bdulac 2014-12-08 07:14:58

+0

Gotcha,@bdulac我調試了失敗的測試 - 上下文不爲空。 – 2014-12-08 16:38:28

回答

1

事實證明,我有context = Robolectric.application

更換context = mock(Context.class)這裏的更新測試:

@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") 
    } 
}