Аргумент переданный для проверки не является издевательством - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в написании тестов на Java и пытаюсь выучить Mockito.

Это часть класса, который я хочу протестировать.

public class ExamRepository implements IExamRepository {
    private static final Logger LOGGER = LogManager.getLogger(ExamRepository.class);

    private IStudentRepository studentRepository = new StudentRepository();
    private EntityManager entityManager;

    public ExamRepository() {
        entityManager = EntityController.getEntityManager();
    }

    public ExamRepository(EntityManager entityManager){
        this.entityManager = entityManager;
    }

    // Get all exam skeletons from the DB
    @Override
    public List<ExamSkeleton> getAllSkeletons() {
        try {
            TypedQuery<ExamSkeleton> query = entityManager.createQuery("SELECT NEW ExamSkeleton (s.id, s.filename, s.course, s.visible) FROM ExamSkeleton as s", ExamSkeleton.class);

            return query.getResultList();
        } catch (IllegalArgumentException exception) {
            LOGGER.error(exception);
        }

        return Collections.emptyList();
    }
}

Это реальный тест, который я написал, у меня возникло ощущение ошибки: Аргумент переданный для verify () имеет типExamRepository и не макет!

происходит из-за этой строки:

examRepository = new ExamRepository(entityManager);

Однако я не уверен, как ее переписать.Я также не уверен, что еще я должен проверять, за исключением того факта, что он запускался один раз.

public class ExamRepositoryTest {
    @InjectMocks
    private ExamRepository examRepository;

    @Mock
    private EntityManager entityManager;

    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();

    @Test
    public void canGetAllSkeletons(){
        examRepository = new ExamRepository(entityManager);

        List<ExamSkeleton> examSkeletons = new ArrayList<>();
        examSkeletons.add(new ExamSkeleton());
        examSkeletons.add(new ExamSkeleton());

        TypedQuery query = mock(TypedQuery.class);
        when(entityManager.createQuery(anyString(), Matchers.anyObject())).thenReturn(query);
        when(query.getResultList()).thenReturn(examSkeletons);

        verify(examRepository, times(1)).getAllSkeletons();
    }
}

Надеюсь, вы, ребята, можете поставить меня на правильный путь!

1 Ответ

0 голосов
/ 27 мая 2018

Используйте это так:

@Test
public void canGetAllSkeletons(){
    examRepository = new ExamRepository(entityManager);

    List<ExamSkeleton> expected = new ArrayList<>();
    expected.add(new ExamSkeleton());
    expected.add(new ExamSkeleton());

    TypedQuery query = mock(TypedQuery.class);
    when(entityManager.createQuery(anyString(), anyObject())).thenReturn(query);
    when(query.getResultList()).thenReturn(expected);

    List<ExamSkeleton> result = examRepository.getAllSkeletons();

    assertEquals(expected, result);
}

Ваша идея была почти правильной, но вместо проверки вызова вам просто нужно сделать фактический вызов examRepository.getAllSkeletons() в своем тесте и проверить результат поожидаемое возвращаемое значение для TypedQuery.

И поскольку вы можете получить правильный список результатов только в том случае, если ваши предыдущие шаги насмешки сработали, вам не нужно проверять какие-либо вызовы в макете EntityManager.

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