我的JUnit测试删除操作是否正确?

时间:2014-05-22 10:41:26

标签: java android junit mockito ormlite

我想为删除操作编写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);
}

1 个答案:

答案 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;然后检查x5

此外,如果您的目的是检查删除工作,那么您的测试会被误导性地命名......像deleteTest之类的东西可能是一个更好的名字: - )