Java Mockito的Mocking方法链接(特别是JPA TypedQuery)
我有很多代码,比如下面的示例,我需要用Mockito进行测试Java Mockito的Mocking方法链接(特别是JPA TypedQuery),java,unit-testing,jpa,mockito,Java,Unit Testing,Jpa,Mockito,我有很多代码,比如下面的示例,我需要用Mockito进行测试 return entityManager .createNamedQuery("queryName", Type.class) .setParameter("foo", "fish") .setParameter("bar", 42) .getSingleResult(); 我已经注入了一个模拟的EntityManager,并让它返回一个模拟的TypedQuery,等等。问题是我需要为TypedQue
return entityManager
.createNamedQuery("queryName", Type.class)
.setParameter("foo", "fish")
.setParameter("bar", 42)
.getSingleResult();
我已经注入了一个模拟的EntityManager,并让它返回一个模拟的TypedQuery,等等。问题是我需要为TypedQuery中的每个方法指定如下规则,以便在没有NullPointerException的情况下成功运行测试
when(mockedTypedQuery.setParameter(any(String.class), any(Object.class)))
.thenReturn(mockedTypedQuery);
有没有更有效的方法?我在这种情况下所做的,完全是受这篇文章的启发: 我有以下服务:
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;
}
}
}));
}
}
@RunWith(MockitoJUnitRunner.class)
公共类ChainMethodsMockTest{
TypedQuery-mockedTypedQuery=fluentMock(TypedQuery.class);
@注射模拟
测试服务测试服务;
@试验
public void testMockito(){
最终ArrayList值=新ArrayList();
增加价值(“a”);
增加价值(“b”);
Mockito.when(mockedTypedQuery.getResultList()).thenReturn(值);
最终列表测试=testService.test();
Assert.assertEquals(2,test.size());
}
公共静态T fluentMock(最终类类型){
返回Mockito.mock(类型,Mockito.withSettings().defaultAnswer(
新的ReturnsEmptyValues(){
@凌驾
公共对象应答(调用锁调用){
对象defaultReturnValue=super.answer(调用);
if(type.equals(invocation.getMethod().getReturnType())){
返回invocation.getMock();
}否则{
返回默认返回值;
}
}
}));
}
}
fluentMock方法,您可以在项目之间共享和重用该方法。此解决方案不适用于我。我认为MockQuery必须被删除,因为TypedQuery必须记住参数。然后,一个回答就可以了。流畅的模拟解决方案对我有效。谢谢你@Manuel