Tor*_*ben 3 java unit-testing jpa mockito
我有很多代码,如下面的示例,我需要使用 Mockito 进行测试。
return entityManager
.createNamedQuery("queryName", Type.class)
.setParameter("foo", "fish")
.setParameter("bar", 42)
.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
我已经注入了一个模拟的 EntityManager 并让它返回一个模拟的 TypedQuery 等。问题是我需要为 TypedQuery 中的每个方法指定如下规则,以便在没有 NullPointerExceptions 的情况下成功运行测试。
when(mockedTypedQuery.setParameter(any(String.class), any(Object.class)))
.thenReturn(mockedTypedQuery);
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?
我在这种情况下所做的完全是受到这篇文章的启发: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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试用例是:
@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;
}
}
}));
}
}
Run Code Online (Sandbox Code Playgroud)
flutterMock 方法,您可以在项目之间共享和重用。
| 归档时间: |
|
| 查看次数: |
3765 次 |
| 最近记录: |