Mockito on Android, Context.getString (id) and NullPointerException

I just started to learn the Mockito testing framework, I followed the official guide: developer.android.com

The code:

private static final String FAKE_STRING = "HELLO WORLD"; @Mock Context mMockContext; @Test public void readStringFromContext_LocalizedString() { // Given a mocked Context injected into the object under test... when(mMockContext.getString(R.string.hello_world)) .thenReturn(FAKE_STRING); ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext); // ...when the string is returned from the object under test... String result = myObjectUnderTest.getHelloWorldString(); // ...then the result should be the expected one. assertThat(result, is(FAKE_STRING)); } 

I wrote the following ClassUnderTest:

 public class ClassUnderTest { private Context context; public ClassUnderTest(Context context) { this.context=context; } public String getHelloWorldString() { return context.getString(R.string.hello_world); } 

}

and after starting I get a NullPointerException:

  java.lang.NullPointerException at android.content.Context.getHelloWorldString(Context.java:293) at com.darekk.draggablelistview.unit_tests.MockitoTest.readStringFromContext_LocalizedString(MockitoTest.java:46) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1619) 

When I replace the android Context with my own class, it works.

Platform: IntelliJ IDEA Community Edition 15.0.6

I really appreciate any help.

+10
android unit-testing testing mockito
source share
4 answers

It seems that you are using the exact code from developer.android.com . Apparently they published an incomplete example. Add this method to your test:

 @Before public void setup(){ MockitoAnnotations.initMocks(this); } 

For More Help Mockito docs

+1
source share

This code should be the first line of your test:

 doReturn("Sample Hello world string") .when(mMockContext) .getString(any(Integer.class)); 

Method step required

+6
source share

Context.getString () is the last method, so you CANNOT play with it by default using Mockito. To enable mockery of the final methods you will need Mockito v2 and follow the instructions here Mockery of the unfashionable: mockery of the final classes / methods

create a file in src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker containing one line:

 mock-maker-inline 

Once you do this, you can model getString () when(mMockContext.getString(R.string.string_name)).thenReturn("Mocked String");

0
source share

Add the following dependency to your build.gradle file

 testImplementation "org.powermock:powermock:1.6.5" 

Than run the code above, it will start working.

0
source share

All Articles