Тестовый пример Mockito для уровня репозитория Сцепленные методы EntityManager - PullRequest
0 голосов
/ 13 декабря 2018

Код репозитория, который нужно протестировать с использованием Mockito:

public List<X> findAll() {

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<X> criteriaQuery = criteriaBuilder.createQuery(X.class);
Root<X> policyRoot = criteriaQuery.from(X.class);

return entityManager.createQuery(criteriaQuery.select(policyRoot)).getResultList();

}

Как смоделировать методы entityManger cretedQuery () и getResultList ()?

@Test
public void testCase() {
when(entityManager.getCriteriaBuilder()).thenReturn(new 
CriteriaBuilderImpl(any()));

Query query = new QueryImpl(any(), any(), any());
when(entityManager.createQuery(anyString())).thenReturn(query);
when(query.getResultList()).thenReturn(attributeList);

}

Выдает исключение NullPointerException.

1 Ответ

0 голосов
/ 13 декабря 2018

Используйте издевательства.Убедитесь, что entityManager является инъекционным в классе, который вы пытаетесь протестировать.Для модульного теста я бы определенно сделал такой тест.Он не проверяет базу данных, но он проверяет все выполненные вызовы и общую логику приложения.Я согласен, что вы должны также написать интеграционный тест, который проверит «реальный» вызов базы данных и результат.

@RunWith(MockitoJUnitRunner.class)
public class QueryTest {
    @Mock
    TypedQuery<X> query;

    @Mock
    CriteriaBuilderImpl criteriaBuilder;

    @Mock
    CriteriaQuery<X> criteriaQuery;

    @Mock
    Root<X> policyRoot;

    @Mock
    EntityManager manager; // This mock should be injected in the class that is been tested

    @InjectMocks
    TestClass sut; //System Under Test

    @Test
    public void test() {
        when(manager.getCriteriaBuilder()).thenReturn(criteriaBuilder);
        when(criteriaBuilder.createQuery(any(X.class)).thenReturn(criteriaQuery);
        when(criteriaQuery.from(any(X.class)).thenReturn(policyRoot);
        when(criteriaQuery.select(eq(policyRoot))).thenReturn(criteriaQuery);
        when(manager.createQuery(eq(criteriaQuery)).thenReturn(query);
        when(query.getResultList()).thenReturn(Collections.emptyList());

        List<X> result = sut.findAll();

        // now verify
        verify(manager, times(1)).getCriteriaBuilder();
        verify(criteriaBuilder, times(1)).createQuery(any(X.class));
        // and so on

        // now write your assertions
        assertEquals(0, result.getSize());
    }
}
...