因此,我想对几种不同的Dao方法使用通用测试。在Dao内部,我将保存功能实现为独立于实体,因此我认为最好也使测试独立于实体。目前,我的jmockit测试之一具有以下条件,该测试与spring自动连接。
@Injectable
public EntityManager em;
@Tested
SyncClaimDao syncClaimDao = new SyncClaimDaoImpl();
@Before
public void setUp() {
Deencapsulation.setField(syncClaimDao, "em", em);
}
private void testSaveEntity (Class T) {
// Existing claim happy path
new Expectations() {
{
em.contains(any); result = true;
em.merge(any);
}
};
if (T.isInstance(SyncClaimEntity.class)) {
Assert.assertTrue(syncClaimDao.saveClaim(new SyncClaimEntity()));
} else if (...) {...}
}
@Test
public void testSaveClaim() {
testSaveEntity(SyncClaimEntity.class);
}
SyncClaimDaoImpl
@Override
public boolean saveClaim(SyncClaimEntity claim) {
return saveEntity(claim);
}
private boolean saveEntity(Object entity) {
boolean isPersisted = false;
try {
isPersisted = em.contains(entity);
if (isPersisted) {
em.merge(entity);
} else {
em.persist(entity);
em.flush();
isPersisted = true;
}
logger.debug("Persisting " + entity.getClass().getSimpleName() + ": " + entity.toString());
}
catch (NullPointerException ex) {
...
}
catch (IllegalArgumentException ex) {
...
}
return isPersisted;
}
运行测试时,我看到以下错误:
mockit.internal.MissingInvocation: Missing invocation of:
javax.persistence.EntityManager#contains(Object)
with arguments: any Object
on mock instance: javax.persistence.$Impl_EntityManager@44022631
at at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
... 4 more
Caused by: Missing invocation
at [redacted].dal.dao.SyncClaimDaoImplTest$1.<init>(SyncClaimDaoImplTest.java:48)
at [redacted].dal.dao.SyncClaimDaoImplTest.testSaveEntity(SyncClaimDaoImplTest.java:46)
at [redacted].dal.dao.SyncClaimDaoImplTest.testSaveClaim(SyncClaimDaoImplTest.java:67)
... 10 more
现在,如果我将Expectations块移动到@Test方法中,如下所示:
@Test
public void testSaveClaim() {
new Expectations() {
{
em.contains(any); result = true;
em.merge(any);
}
};
Assert.assertTrue(syncClaimDao.saveClaim(new SyncClaimEntity()));
我应该成功进行测试。我认为Test方法的春季自动装配不能正确地确定我的期望。这就是为什么我看到缺少的调用错误的原因。
是否有人对如何概括我的期望有任何想法,以便我可以为广义方法创建更简单的测试?
我现在看到了错误:T.isInstance(SyncClaimEntity.class)
。Class#isInstance(Object)
应该用类的实例而不是类本身来调用该方法。因此,它总是返回false,因为SyncClaimEntity.class
显然不是的实例SyncClaimEntity
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句