首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对DAOs单元测试的质疑

对DAOs单元测试的质疑
EN

Stack Overflow用户
提问于 2015-07-17 11:50:26
回答 2查看 2.4K关注 0票数 2

我正在寻找信息来构建典型DAO方法的单元测试(按用户名查找用户等)。我发现了几个使用模拟的例子,比如:DE/unit-testing-with-junit-and-mockito/

代码语言:javascript
复制
@Test
public void testComeGetSome() {
    // Mock the EntityManager to return our dummy element
    Some dummy = new Some();
    EntityManager em = Mockito.mock(EntityManager.class);
    Mockito.when(em.find(Some.class, 1234)).thenReturn(dummy);

    // Mock the SomeDao to use our EntityManager
    SomeDao someDao = Mockito.mock(SomeDao.class);
    Mockito.when(someDao.comeGetSome(1234)).thenCallRealMethod();
    Mockito.when(someDao.getEntityManager()).thenReturn(em);

    // Perform the actual test
    Assert.assertSame(dummy, someDao.comeGetSome(1234));
    Assert.assertNull(someDao.comeGetSome(4321));
}

在Lasse的“使用EasyMock而不是Mockito”一书中也有类似的例子。

问题是:我们在这些例子中真正测试的是什么?我们基本上是通过模拟告诉查询应该返回哪个对象,然后断言它实际上返回了我们告诉它返回的对象。

我们没有测试查询是否正确,或者它是否返回不同的对象,或者根本没有对象(甚至不止一个对象)。当数据库中不存在对象时,我们无法测试它是否返回null。这条线

代码语言:javascript
复制
Assert.assertNull(someDao.comeGetSome(4321));

之所以有效,是因为该参数没有脚本化的交互,而不是因为对象不存在。

看起来我们只是在测试该方法是否调用了适当的方法和对象(em.find)。

单元测试的意义是什么?Java中是否有任何好的框架可以快速地建立内存数据库并使用它执行测试?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-17 14:06:29

你的怀疑很有道理。实际上,在大多数情况下,不需要用单元测试来测试DAO,因为单元测试只处理一个层,但是DAO与数据库层协作。

本文解释了这个想法:http://www.petrikainulainen.net/programming/testing/writing-tests-for-data-access-code-unit-tests-are-waste/

因此,我们应该用集成测试来测试DAO和数据库层。集成测试同时考虑了DAO和数据库层。

本文将提供Spring + Hibernate示例:https://dzone.com/articles/easy-integration-testing

票数 3
EN

Stack Overflow用户

发布于 2015-07-17 12:07:53

它看起来更像服务测试,而不是真正的DAO测试。例如,我正在使用dbunit测试我的DAO层。

例如,我有带有两个字段的Author表:idname。我正在创建一个数据集xml文件,如

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <AUTHOR AUTHOR_ID="1" NAME="FirstAuthor"/>
    ...
    <AUTHOR AUTHOR_ID="10" NAME="TenthAuthor"/>
</dataset>

然后在我的测试类中使用Mockito测试我的DAO方法,如

代码语言:javascript
复制
@Test
@DatabaseSetup(value = "/dao/author/author-data.xml")
public void testFindAll() {
    List<Author> authorList = this.authorDAO.findAll();
    assertEquals(10, authorList.size());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31475186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档