PowerMockito Издевался над конечным классом gson.fromJson() Возвращает ноль

У меня есть этот код в основном классе -

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 равно нулю? пожалуйста, помогите/предложите.


person jay thakur    schedule 05.07.2017    source источник
comment
как вы вводите объект gson в тестируемый класс?   -  person Maciej Kowalski    schedule 05.07.2017
comment
gson является Autowired в основном классе. в тесте я использую вот так - when(gsonMock.fromJson(jsonResponse, ExtraPlayer.class)).thenReturn(extraPlayer);   -  person jay thakur    schedule 05.07.2017
comment
является ли fromJson статическим методом?   -  person Maciej Kowalski    schedule 05.07.2017
comment
нет, Gson.java - это последний класс. pkg — импорт com.google.gson.Gson;   -  person jay thakur    schedule 05.07.2017
comment
@jaythakur ты нашел решение выше?   -  person Kasun Siyambalapitiya    schedule 13.03.2020


Ответы (1)


Если бы вы использовали стандартные аннотации @Mock и @InjectMocks с mockito, то да, фреймворк позаботился бы о внедрении макета в тестируемый класс (независимо от существования сеттеров и т. д.).

Другое дело 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 ...
}
person Maciej Kowalski    schedule 05.07.2017
comment
Gson.java — последний класс. Я использовал {@Mock}, {@InjectMock}. но выдавало ошибку, что mockito не может обработать финал. - person jay thakur; 05.07.2017
comment
да .. вот почему вам нужен powermock и вручную внедрить эту зависимость - person Maciej Kowalski; 05.07.2017
comment
не может сделать {player.setGson(gsonMock);}, так как setGson не является методом. - person jay thakur; 05.07.2017
comment
Вам нужно создать его. Пакета первого уровня будет достаточно - person Maciej Kowalski; 05.07.2017
comment
Не совсем ... если вы не можете ввести конструктор или сеттер и используете powermock, тогда у вас остается ручное внедрение путем отражения. - person Maciej Kowalski; 05.07.2017
comment
под ручным внедрением путем отражения, вы имеете в виду {@Autowired} {@Mock} {@InjectMock}? - person jay thakur; 05.07.2017
comment
Нет, я имел в виду необработанный API отражения Java. - person Maciej Kowalski; 05.07.2017
comment
ок. Я использовал { @Mock Gson gsonMock;} теперь gson не равен нулю. но explayer здесь нулевой - extraPlayer = gson.fromJson(jsonResponse, ExtraPlayer.class); - person jay thakur; 05.07.2017
comment
любое предложение nw? одно - ExtraPlayer.class - это статический класс. - person jay thakur; 05.07.2017
comment
вы передаете jsonResponse в метод? - person Maciej Kowalski; 05.07.2017
comment
передача json следующим образом - when(gsonMock.fromJson(jsonResponse, ExtraPlayer.class)).thenReturn(extraPlayer); - person jay thakur; 05.07.2017
comment
это настройка. Когда вы вызываете player.performWaiting();.. он не принимает ответ, так как вы ожидаете, что он будет передан вызову gson? - person Maciej Kowalski; 05.07.2017
comment
Сорри, это так - when(playerHandlerMock.resetPlayer(someString, someString, 1, true)).thenReturn(jsonResponse); - person jay thakur; 05.07.2017
comment
отлажено, jsonResponse работает нормально. кажется где-то проблема со статическим классом ExtraPlayer. нужно издеваться в тестовом классе? если да, как? - person jay thakur; 05.07.2017
comment
Статического класса не существует. Могут быть методы или поля. Попробуйте добавить весь код, относящийся к делу. У меня такое ощущение, что вы не все опубликовали. В противном случае анализ не имеет смысла. - person Maciej Kowalski; 05.07.2017
comment
ExtraPlayer — это простой класс POJO внутри основного класса. - person jay thakur; 05.07.2017
comment
не имеет значения .. строка точно такая же, как в настройке? - person Maciej Kowalski; 05.07.2017
comment
есть еще несколько сеттеров и геттеров. это оно. - person jay thakur; 05.07.2017
comment
не могли бы вы предложить, как это сделать с отражением? - person jay thakur; 05.07.2017
comment
просто попробуйте один из ответов в стеке: stackoverflow .com/questions/32716952/ - person Maciej Kowalski; 05.07.2017