gpt4 book ai didi

java - 对单元测试 DAO 的怀疑

转载 作者:行者123 更新时间:2023-11-30 08:10:50 34 4
gpt4 key购买 nike

我正在寻找为典型的 DAO 方法构建单元测试的信息(通过用户名查找用户等),我发现了几个使用模拟的示例,如下所示:http://www.christophbrill.de/de_DE/unit-testing-with-junit-and-mockito/

@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 Koskela 的书中也有类似的使用 EasyMock 而不是 Mockito。

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

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

Assert.assertNull(someDao.comeGetSome(4321));

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

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

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

最佳答案

你的疑惑还真有道理。实际上在大多数情况下不需要用单元测试来测试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

关于java - 对单元测试 DAO 的怀疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31475186/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com