【问题标题】:Mockito test case for repository layer EntityManager chained methods存储库层 EntityManager 链式方法的 Mockito 测试用例
【发布时间】:2018-12-13 07:30:44
【问题描述】:

要使用 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。

【问题讨论】:

  • 不要。这样的测试不会带来任何价值。相反,编写一个使用测试数据填充数据库的测试,调用该方法,并查看它是否返回预期的 X 列表。

标签: spring-boot intellij-idea mockito testng entitymanager


【解决方案1】:

使用模拟。确保 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());
    }
}

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2021-11-30
    • 2019-08-18
    • 2018-11-24
    • 2021-10-21
    • 2022-01-27
    • 2018-07-30
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多