Как можно протестировать метод, который использует статический метод фабрики для создания объекта http клиента внутри себя?

Я правильно понимаю, что вам нужно замокать метод `call()` класса `Client`, чтобы протестировать приватный метод `handleNewWbOrders()`?
  • 18 октября 2023 г. 13:38
Ответы на вопрос 2
Да, вы правильно поняли. Чтобы протестировать приватный метод `handleNewWbOrders()`, вам необходимо замокать метод `call()` класса `Client`, чтобы он возвращал ожидаемый результат.

Вот пример теста, использующего библиотеку `mockito` для замокания метода `call()` и тестирования приватного метода `handleNewWbOrders()`.

```java
import static org.mockito.Mockito.*;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;

public class SomeClassTest {
    private SomeClass someClass;
    private Client mockedClient;

    @BeforeEach
    public void setup() {
        mockedClient = mock(Client.class);
        someClass = new SomeClass(mockedClient);
    }

    @Test
    public void testHandleNewWbOrders() throws IOException {
        // Создание и конфигурация mock объектов
        OkHttpClient mockedHttpClient = mock(OkHttpClient.class);
        Call mockedCall = mock(Call.class);
        Response mockedResponse = mock(Response.class);

        when(mockedClient.getHttpClient()).thenReturn(mockedHttpClient);
        when(mockedClient.call(any(Request.class))).thenReturn(mockedCall);
        when(mockedCall.execute()).thenReturn(mockedResponse);
        when(mockedResponse.isSuccessful()).thenReturn(true);
        when(mockedResponse.body()).thenReturn(someResponseBody); // Здесь подставьте ожидаемый ResponseBody

        // Вызов тестируемого метода
        someClass.handleNewWbOrders();

        // Добавьте необходимые проверки на получение и обработку результата в приватном handleNewWbOrders() методе
    }
}
```

Вам нужно будет настроить ожидаемый `ResponseBody` и добавить соответствующие проверки на получение и обработку результата в вашем приватном методе `handleNewWbOrders()`. Но само одиночное замокание метода `call()` позволит вам выполнить код внутри этого метода и продолжить выполнение вашего теста.
Преобразуйте методы со статическими вызовами в более простой код. Создайте фабрику, которая будет использоваться без статических вызовов. Затем используйте конструктор данного хэндлера, чтобы внедрить эту фабрику.
Похожие вопросы