简体   繁体   English

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

[英]Is my JUnit test for delete operation correct?

I want to write JUnit test for delete operation that call delete method ORMLite library (it is not important). 我想为调用删除方法ORMLite库的删除操作编写JUnit测试(这并不重要)。 I'm mocking behaviour of ORMLite API in my tests. 我在测试中模拟了ORMLite API的行为。 But I'm not sure that I created the correct test and that I'm really testing delete operation. 但是我不确定是否创建了正确的测试,以及我是否真的在测试删除操作。

So, I have defined some datasource class with operations create(List<Object> o), read(Object o), delete (Object o) . 因此,我已经定义了一些数据源类,其操作为create(List<Object> o), read(Object o), delete (Object o) Here is simplified code. 这是简化的代码。

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

}

Now,I here is created JUnit test. 现在,我在这里创建了JUnit测试。 It's testing that Object was really removed. 正在测试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);
}

You ought to be checking that delete() has been called. 您应该检查是否已调用delete() You probably need something like: 您可能需要类似:

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

I see no benefit in calling dataSource.read() and testing the result, since you've faked that result with your mocked DAO object. 我发现调用dataSource.read()和测试结果没有任何好处,因为您已经使用模拟的DAO对象伪造了该结果。 It doesn't really tell you anything. 它并没有真正告诉您任何事情。 It's like setting int x = 5; 就像设置int x = 5; and then checking x is 5 . 然后检查x5

Also, your test is very misleadingly named if your intention is to check deletion works... Something like deleteTest might be a better name :-) 另外,如果您打算检查删除是否有效,则您的测试名称会被误导。...像deleteTest这样的名称可能是更好的名称:-

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM