jay thakur
jay thakur

Reputation: 151

PowerMockito Mocked final class gson.fromJson() Returns null

I have this code in main class -

try {
    extraPlayer = gson.fromJson(jsonResponse, ExtraPlayer.class);// this returns null
} catch (Exception e) {
    e.printStacktrace();
}

Here extraPlayer is coming as null I have mocked @Mock Gson gsonMock;

Here ExtraPlayer is a static class.

I have written this test code -

@Test
public void test() {
    String jsonResponse = "{\"status\":\"waiting\",\"no\":\"12\"}";
    when(playerHandlerMock.resetPlayer("someString", "someString", "1",true    
         )).thenReturn(jsonResponse);       
    Gson gsonMock = PowerMockito.mock(Gson.class);
    ExtraPlayer extraPlayer = new ExtraPlayer();
    extraPlayer.setNo("12");
    extraPlayer.setStatus("Waiting");

    PowerMockito.mockStatic(ResetModemResponse.class); // using this for static class but didn't work.

    PowerMockito.when(gsonMock.fromJson(jsonResponse, ExtraPlayer.class)).thenReturn(extraPlayer);

    playerMock.performWaiting();
}

ExtraPlayer.java

public static class ExtraPlayer{

    String no;
    String status;      

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getNo() {
        return code;
    }

    public void setNo(String no) {
        this.no = no;
    }

}

I have added these annotations to the test class -

@RunWith(PowerMockRunner.class)
@PrepareForTest(Gson.class)

why extraPlayer is null ? please help/Suggest.

Upvotes: 2

Views: 10044

Answers (1)

Maciej Kowalski
Maciej Kowalski

Reputation: 26552

If you were to use the standard @Mock and @InjectMocks annotation with mockito, then yes, the framework would take care of the injection of the mock into the class under test (regardless of the existence of the setters etc.).

Another thing is the playerMock, which i assume is the class under test.

Do not mock the class under test, create a normal instance and then inject the dependencies... the performWaiting method does not seem to accept the response String, so you would have to inject that also somehow (unless you left some parts out):

@Test
public void test() {
    // Arrange
    String jsonResponse = "{\"status\":\"waiting\",\"no\":\"12\"}";     
    Gson gsonMock = PowerMockito.mock(Gson.class);
    ExtraPlayer extraPlayer = new ExtraPlayer();
    extraPlayer.setNo("12");
    extraPlayer.setStatus("Waiting");

    PowerMockito.when(gsonMock.fromJson(jsonResponse, ExtraPlayer.class)).thenReturn(extraPlayer);

    Player player = new Player();
    player.setGson(gsonMock);
    player.setResponse(jsonResponse);

    // Act
    player.performWaiting();

    // Assert ...
}

Upvotes: 0

Related Questions