【问题标题】:PowerMockito Mocked final class gson.fromJson() Returns nullPowerMockito 模拟最终类 gson.fromJson() 返回 null
【发布时间】:2017-07-05 13:14:54
【问题描述】:

我在主类中有这段代码 -

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

这里extraPlayer 为空 我嘲笑过@Mock Gson gsonMock;

这里的ExtraPlayer是一个静态类。

我已经写了这个测试代码 -

@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;
    }

}

我已经在测试类中添加了这些注解-

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

为什么 extraPlayer 是 null ?请帮助/建议。

【问题讨论】:

  • 如何将gson对象注入到被测类中?
  • gson 在主类中自动装配。在测试中我这样使用 - when(gsonMock.fromJson(jsonResponse, ExtraPlayer.class)).thenReturn(extraPlayer);
  • fromJson 是静态方法吗?
  • 不,Gson.java 是最终类。 pkg 是 - 导入 com.google.gson.Gson;
  • @jaythakur 你找到上面的解决方案了吗

标签: unit-testing junit mockito powermockito


【解决方案1】:

如果您要使用标准的 @Mock@InjectMocks 注释和 mockito,那么是的,框架会负责将 mock 注入到被测类中(不管 setter 等是否存在)。 )。

另一件事是playerMock,我假设它是被测类。

不要模拟被测类,创建一个普通实例然后注入依赖项...performWaiting 方法似乎不接受响应字符串,所以你也必须以某种方式注入它(除非你离开一些部分):

@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 ...
}

【讨论】:

  • Gson.java 是最终类。我正在使用 {@Mock}、{@InjectMock}。但它抛出了 mockito 无法处理 final 的错误。
  • 是的..这就是为什么你需要 powermock 并手动注入该依赖项
  • 不能做 {player.setGson(gsonMock);} 因为 setGson 不是一种方法。
  • 你需要创建一个.. 一个包级别就足够了
  • 不是真的......如果你不能通过构造函数或 setter 注入并且你正在使用 powermock,那么你将通过反射手动注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多