繁体   English   中英

使用Mockito(特别是JPA TypedQuery)链接模拟方法

[英]Mocking method chaining with Mockito (especially a JPA TypedQuery)

我有很多代码,例如下面的示例,需要使用Mockito进行测试。

return entityManager
    .createNamedQuery("queryName", Type.class)
    .setParameter("foo", "fish")
    .setParameter("bar", 42)
    .getSingleResult();

我已经注入了一个模拟的EntityManager,并使其返回模拟的TypedQuery等。问题是,我需要为TypedQuery中的每个方法指定如下规则,以使测试成功运行而没有NullPointerExceptions。

when(mockedTypedQuery.setParameter(any(String.class), any(Object.class)))
        .thenReturn(mockedTypedQuery);

有没有更有效的方法?

我在这种情况下所做的工作完全受此帖子的启发: http : //geeks.autotrader.co.uk/2014/03/mocking-fluent-interfaces-with-mockito.html

我有以下服务:

public class TestService {

    public TypedQuery typedQuery;

    public List test(){
        final TypedQuery typedQuery1 = typedQuery.setParameter("a", "a");
        return typedQuery1.setParameter("b", "b").getResultList();
    }
}

我的测试案例是:

@RunWith(MockitoJUnitRunner.class)
public class ChainMethodsMockTest {

    TypedQuery mockedTypedQuery = fluentMock(TypedQuery.class);

    @InjectMocks
    TestService testService;

    @Test
    public void testMockito(){
        final ArrayList value = new ArrayList();
        value.add("a");
        value.add("b");
        Mockito.when(mockedTypedQuery.getResultList()).thenReturn(value);
        final List test = testService.test();
        Assert.assertEquals(2, test.size());
    }

    public static <T> T fluentMock(final Class<T> type) {
        return Mockito.mock(type, Mockito.withSettings().defaultAnswer(
                new ReturnsEmptyValues() {
                    @Override
                    public Object answer(InvocationOnMock invocation) {
                        Object defaultReturnValue = super.answer(invocation);
                        if (type.equals(invocation.getMethod().getReturnType())) {
                            return invocation.getMock();
                        } else {
                            return defaultReturnValue;
                        }
                    }
                }));
    }
}

您可以在项目之间共享和重用的fluentMock方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM