Ответ Mocking Network для тестового примера - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь создать тестовый набор для AlbumsController, который выбирает данные из сети и анализирует их.

AlbumService: отвечает за сетевой вызов и получение данных. ( Предположим, что это может быть что-нибудь, что выполняет некоторую асинхронную задачу и, соответственно, выполняет обратный вызов, чтобы избежать специфических решений для сервера "1007" )

public class AlbumsController {

    public void getAlbums(final ServiceCallback<AlbumsWrapper> albumsServiceCallback) {

        new AlbumsService().fetchAlbums(new ServiceCallback<NetworkResponse>() {
            @Override
            public void onSuccess(NetworkResponse response) {
                // parse response
            }

            @Override
            public void onFailure(NetworkResponse error) {
                // do something for Failure
            }
        });
    }



public class AlbumControllerTest {

    @Mock
    private ServiceCallback<NetworkResponse> serviceCallback;

    @Captor
    private ArgumentCaptor<ServiceCallback<AlbumsWrapper>> albumsWrapper;

    @Captor
    private  ArgumentCaptor<ServiceCallback<NetworkResponse>> networkResponseArgumentCaptor;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void parseAlbums_EmptyList_ReturnsTrue() {

// below are different ways I am trying with no success so far.
        AlbumsController albumsController = new AlbumsController();
        albumsController.getAlbums(albumsWrapper.capture());


        NetworkResponse response = new NetworkResponse();
        networkResponseArgumentCaptor.capture();
        networkResponseArgumentCaptor.getValue().onSuccess(response);
    }
}

Цель:

  • Чтобы смоделировать AlbumService внутри getAlbums метода, чтобы вместо получения данных с сервера я мог вызывать onSuccess() с моими тестовыми данными в качестве аргумента.И возможно ли получить список после синтаксического анализа, чтобы я мог assert основываться на данных в списке?
  • Я не хочу переносить код, отвечающий за синтаксический анализ, на какой-либо метод и сделать его общедоступным,Мое намерение здесь состоит в том, чтобы понять, как обращаться с таким случаем.
  • Открыт для рефакторинга кода, если об этом нужно позаботиться в TDD.
  • Полное решение или указатели для поискаоба ценятся.

Библиотеки

  • mockito-core: 2.2.9
  • junit: 4.12

1 Ответ

0 голосов
/ 19 февраля 2019

Если возможен небольшой рефакторинг, то:

1) Переместите new AlbumsService() к методу уровня пакета:

AlbumService createAlbumService(){
    return new AlbumService();
}

...

public void getAlbums(final ServiceCallback<AlbumsWrapper> albumsServiceCallback) {

    createAlbumService().fetchAlbums(new ServiceCallback<NetworkResponse>()

package видимость равнаДостаточно, поскольку тестовый класс будет в том же пакете, что и AlbumController.

2) Шпион AlbumController:

@Spy
private AlbumsController albumsControllerSpy = new AlbumController();

@Mock 
private AlbumService albumServiceMock;

3) Заставьте метод createAlbumService() вернуть ваш макет:

@Test
public void parseAlbums_EmptyList_ReturnsTrue() {

    doReturn(albumServiceMock).when(albumControllerSpy).createAlbumService();
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...