Насмешливый ответ не работает и вызывается реальный метод - PullRequest
0 голосов
/ 27 января 2020

Я работаю с mockito и пытаюсь протестировать метод get из моего сервиса. Проблема в том, что тест вызывает реальный метод, и по этой причине он вообще не работает. Следующий метод, который я хотел бы проверить:

     public Hours getHours(String id) throws IllegalArgumentException {
        logger.debug("getting id {}", id);
        try {
          return repository.get(validateUuid(id).toString());
        } catch (Exception e) {
          logger.error("there was an issue querying with id {}", id, e);
          publishError("get", e);
          throw new IllegalArgumentException(
              String.format("there was an issue querying with id {%s}", id));
        }
    }

    private UUID validateUuid(String id) {
        try {
          return UUID.fromString(id);
        } catch (Exception e) {
          throw new IllegalArgumentException("the id given was was invalid", e);
        }
    }

Это код моего теста:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.when;

class serviceTest {

    @Mock
    private Repository<Hours> repository;
    private Service service;

    @BeforeEach
    public void init() {
        MockitoAnnotations.initMocks(this);
        service = new service();
    }

    @Test
    void addHours() {
        Hours hours = new Hours();
        hours.setCorrelationId("a-988787888b712ijj-0997878");
        hours.setPerner("720022");

        given(repository.post(any(Hours.class), anyBoolean())).willReturn(hours);

        Hours persistedHours = service.addHours(hours);

        assertEquals(persistedHours, hours);
    }

    @Test
    void getHours() {
        String mockedUUID = UUID.randomUUID().toString();
        Hours hours = new Hours();
        Hours.setCorrelationId("a-988787888b712ijj-0997878");

        when(repository.get(mockedUUID)).thenReturn(hours);

        Hours persistedHours = service.getHours(mockedUUID);

        assertEquals(persistedHours.getCorrelationId(), hours.getCorrelationId());
    }

    @Test
    void getHousrAll() {
        List<Hours> hoursList  = new ArrayList<>();
        PaginatedResult<Hours> result = new PaginatedResult<>();
        result.setResult(hoursList);

        given(repository.get(any(Query.class))).willReturn(result);

        PaginatedResult<Hours> result2 = service.getHousrAll(new Query());

        assertEquals(result , result2);
    }
}

Я также использовал:

given(banquetLaborHoursRepository.get(anyString())).willReturn(banquetLabourHours);

Но результат был тот же. Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Это может помочь вам. Обычно, когда вы проводите тестирование, вы устанавливаете зависимость в mocked объект. Здесь репозиторий является зависимостью для YourService. @InjectsMock в основном устанавливает макет объекта репозитория в ваш сервис.

Но если вы не хотите использовать аннотации, вам нужно создать фиктивный объект сервиса и фиктивный объект репозитория и установить его в объект сервиса сервиса. Это тоже будет работать, но аннотации, такие как InjectsMock, сокращают для нас код.

 @RunWith(MockitoJUnitRunner.class)
    class GameTester {

    @InjectMocks
    YourService service;
    @Mock
    Repository repository;

    @Test
        void getHours() {
            Hours hours = new Hours();
            hours.setCorrelationId("a-988787888b712ijj-0997878");
            when(repository.get(mockedUUID)).thenReturn(hours);

            Hours persistedBanquet = service.getHours("a-988787888b712ijj-0997878");
            assertEquals(persistedBanquet.getCorrelationId(), hours.getCorrelationId());
        }
}
0 голосов
/ 27 января 2020
@Test
void getHours() {
    // This generates a different uuid everytime
    String mockedUUID = UUID.randomUUID().toString();
    Hours hours = new Hours();
    hours.setCorrelationId("a-988787888b712ijj-0997878");

    // Use mockito.anyString() instead of passing this uuid
    given(repository.get(mockedUUID)).willReturn(hours);

    Hours persistedBanquet = 
     service.getHours(mockedUUID);

    assertEquals(persistedBanquet.getCorrelationId(), 
     hours.getCorrelationId());
}

Вместо насмешки над однострочной сущностью, т.е. значением uuid, передайте Mockito.anyString (). Таким образом, метод будет смоделирован для любой строки в качестве аргумента для хранилища.

В противном случае вместо генерации uuid каждый раз используйте одно и то же значение uuid, например, переменную stati c, и смоделируйте его, используя mockito.eq (static_uuid) способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...