java - 我的删除操作 JUnit 测试正确吗?

标签 java android junit mockito ormlite

我想为调用ORMLite库的删除方法的删除操作编写JUnit测试(这并不重要)。我在测试中 mock 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测试。它正在测试对象是否真的被删除。

@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);
}

最佳答案

您应该检查是否已调用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 这样的名称可能是更好的名称:-)

关于java - 我的删除操作 JUnit 测试正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23804546/

相关文章:

java - 如何获取我当前位置的街道的车道数?

android - 单个 Activity 的两种布局

java - 为什么在扩展 TestCase 类时找不到或加载主类

java - JUnit 测试 Spymemcached 客户端

java - 在 IntelliJ IDEA 中使用 JUnit RunListener

java - 如何定义 java 组件以便它与鼠标监听器一起工作

java - 动画岩石无法正确生成

java - 组装后如何使用android库

java - 我丢失了我的 R 文件。?我不知道发生了什么事。?

java - 类转换异常