Как мне смоделировать статический метод, который вызывает другие частные статические методы?

Как я могу смоделировать этот метод ниже, который вызывает другой частный статический метод?

public class testA {
    public static JSONObject retrieveOrder(String orderId)
                throws Exception {
            String url = "/contract/"; 
            JSONObject order = new JSONObject();
            order.put("orderId", orderId);  
            return orderPOST(url, order);
        }

    private static orderPOST(String url, JSONObject order) {
        return orderPOSTString(url, order.toString());
    }

    private static orderPOSTString (String url, String order) {
         //do another call to method which will return JSONObject
    }
}

Как я могу просто издеваться retrieveOrder метод только как мне все равно, какие из этих частных методов? А что касается этих приватных статических методов, я не могу изменить ни один из них, поэтому должен принимать их как есть.

Это мой тест:

@Test
    public void testRetrieveOrderMethod() throws Exception {
        String url = "/contract/"; 
        JSONObject order = new JSONObject();
        order.put("orderId", orderId);  
        PowerMockito.spy(testA.class);
        PowerMockito.doReturn(url, order.toString()).when(testA.class, "orderPOST", Matchers.any(), Matchers.any());
        JSONObject retrieved = testA.retrieveOrder("12345");
    }  

Пожалуйста, дайте мне знать, если я что-то упустил здесь. Я продолжаю получать NullPointerException как я подозреваю, это на самом деле вызывает эти частные методы.

1 ответ

В вашем коде when(testA.class, "orderPOST"... издевается orderPost метод.

Если вы хотите издеваться только retrieveOrder метод и хотите игнорировать другие, ваш тестовый класс должен быть:

@RunWith(PowerMockRunner.class) // needed for powermock to work
// class that has static method and will be mocked must be in PrepareForTest
@PrepareForTest({ testA.class })
public class MyTestClass {

    @Test
    public void testRetrieveOrderMethod() throws Exception {
        // JSON object you want to return
        JSONObject order = new JSONObject();
        order.put("orderId", "whatever value you want to test");

        PowerMockito.spy(testA.class);
        // retrieveOrder will return order object
        PowerMockito.doReturn(order).when(testA.class, "retrieveOrder", Mockito.anyString());

        // call static method
        JSONObject retrieved = testA.retrieveOrder("12345");

        // do the assertions you need with retrieved
    }
}

Вы также можете изменить spy а также doReturn чтобы:

PowerMockito.mockStatic(testA.class);
Mockito.when(testA.retrieveOrder(Mockito.anyString())).thenReturn(order);

Оба будут работать одинаково.

Другие вопросы по тегам