我想为删除操作编写JUnit测试,调用delete方法ORMLite库(这并不重要)。我在我的测试中嘲笑ORMLite API的行为。但我不确定我是否创建了正确的测试,而且我确实在测试删除操作。
所以,我已经定义了一些带有操作create(List<Object> o), read(Object o), delete (Object o)
的数据源类。这是简化的代码。
class ObjectDataSource {
public void create (List<Object> o) {
ormapi.create(o);
}
public List<Object> read (Object o ) {
return ormapi.queryForMatching(o);
}
public void delete (Object o) {
ormapi.delete(o);
}
}
现在,我在这里创建了JUnit测试。它正在测试Object是否已被删除。
@Test
public void readTest() {
// ormlite api init
RuntimeExceptionDao<Object, Integer> dao = mock(RuntimeExceptionDao.class);
ObjectDbHelper dbHelper = new ObjectDbHelper(context, dao);
ObjectDataSource dataSource = new ObjectDataSource(context, dbHelper);
// data init
Object object = new Object() {{ setId(47); }};
Object completeObject = new Object {{ setId(47); setObjectName("test object"); }}
List<Object> list = ArrayList<Object>();
list.add(completeObject);
// api mocking
when(dao.queryForMatching(object)).thenReturn(new ArrayList<Object>());
// testing
dataSource.create(list);
dataSource.delete(object);
List<Object> readList = dataSource.read(object);
Assert.assertEquals(new ArrayList<Object>(), readList);
}
答案 0 :(得分:1)
您应该检查是否已调用delete()
。你可能需要这样的东西:
@Test
public void readTest() {
// ormlite api init
RuntimeExceptionDao<Object, Integer> dao = mock(RuntimeExceptionDao.class);
ObjectDbHelper dbHelper = new ObjectDbHelper(context, dao);
ObjectDataSource dataSource = new ObjectDataSource(context, dbHelper);
// data init
Object object = new Object() {{ setId(47); }};
Object completeObject = new Object {{ setId(47); setObjectName("test object"); }}
List<Object> list = ArrayList<Object>();
list.add(completeObject);
// testing
dataSource.create(list);
dataSource.delete(object);
// verify that ObjectDataSource class correctly invokes delete
// method on DAO:
verify(dao).delete(object);
}
我认为调用dataSource.read()
并测试结果没有任何好处,因为您已经使用模拟的DAO对象伪造了该结果。它并没有真正告诉你任何事情。这就像设置int x = 5;
然后检查x
是5
。
此外,如果您的目的是检查删除工作,那么您的测试会被误导性地命名......像deleteTest
之类的东西可能是一个更好的名字: - )