2012-07-18 18 views
1

对于单元测试,模拟数据层还是使用像德比这样的嵌入式数据库会更好?通过模拟数据层或使用嵌入式数据库进行单元测试

我知道这也取决于测试的目的。但是如果我和德比一起去,我不必嘲笑所有的对象,我认为这会更容易。另一方面,我明白这更多的是集成测试。那么单元测试更常见哪一种?

感谢。

根据意见更新:

所以我现在德比配置的,但我的经理坚持使用EasyMock的。我们使用jpa,我们有大约20个表=>数据模型。那么对于像项目模型这样的每种方法,我是否应该为其所有方法指定mockedProject的返回类型?像getProjectName(),getProjectId()等?我也应该嘲笑持久管理器对象。我认为这只是配置像德比这样的嵌入式数据库而已。

+0

你的更新在技术上是另一个问题,所以只有几句话。你不应该模拟值对象(我假设'Project'是一个实体)。而是模拟行为。使用JPA嘲讽'EntityManager'应该足够了。 – 2012-07-18 21:58:23

+0

更详细的问题:http://stackoverflow.com/questions/11551905/unit-testing-a-method-with-easymock – Sara 2012-07-18 23:34:18

回答

1

看到,如果你正在使用JPA,您不必嘲笑你的项目的对象,因为他们可能只是哑POJO的,对吧?你需要模拟的只是持久性管理器对象(EntityManager)。在最简单的情况下(如果你使用Mockito或Easymock和'niceMock'),你可能只需要创建模拟并注入它,就是这样。根据你在测试什么,你可能会想要做的比这更多:验证一个savemerge方法被调用,指定它是一个get调用返回一个特定的项目对象等

嘲讽EntityManager具有以下优点:

  1. 运行速度非常快 - 甚至比嵌入式数据库快得多。这些测试将会进行很多次,所以重要的是他们不要太过担子。
  2. 您不需要填充真实的数据库。尽管您可能需要为某些集成测试执行此操作,但很难提供涵盖所有所需场景的数据库。通过嘲笑,您可以在测试本身中创建您想要的特定场景。
  3. 您可能想要测试某些在现实中很难发生的情况,例如IO错误或数据库中已存在但违反了某些约束条件的数据。嘲笑,你只是告诉模拟在调用方法时抛出异常。连接到一个真实的数据库(甚至是嵌入式的),要想实现它,将是非常困难的(如果不是不可能的话)。

嘲笑POJO没有这些好处。将POJO的代码作为嘲讽的POJO执行同样快。填充POJO可能有点痛苦,但不如建立模拟POJO的行为。而且由于POJO通常不具有很多外部依赖性,所以很少需要第三个好处。

+0

非常感谢。这是我正在寻找的。我对嘲笑不太了解。我会发布另一个问题,并通过链接在这里。如果你稍后可以看看,我将不胜感激。谢谢。 – Sara 2012-07-18 23:15:57

+0

如果你有时间,你可以看看这个:http://stackoverflow.com/questions/11551905/unit-testing-a-method-with-easymock – Sara 2012-07-18 23:35:01

1

对于单元测试,我会推荐嘲笑你的数据层。这就清楚地表明你没有测试数据层的功能,并且也增加了单元测试的速度。

进行集成测试时,您应该将实时数据库连接到您的数据层,我倾向于使用与生产中使用的数据库相同类型的数据库来限制稍后引入新错误的风险。另外,我建议让每个测试都构建自己的测试数据并将其删除,因为这可确保每个测试不受与其他测试案例中测试数据交互的影响。

2

首先,如果你使用单元测试的外部组件(如数据库,文件系统等),他们不能再被称为单元测试,但集成测试来代替。

在另一方面引述经典Mocks Aren't Stubs说:

  • 对象实际上有工作的实现,但通常需要一定的快捷方式,这使得它们不适合用于生产(一个内存数据库是一个好例子)。

并没有什么错在单元测试中使用假货。

这就是说我建议使用一些快速和简单的内存数据库,如。嘲讽DataSourceConnection,ResultSet,PreparedStatement ......只是不值得痛苦。

+0

问题不在于单元测试数据层,所以你不需要模拟所有的内部它只有它自己用于测试代码的其他部分的层。 – 2012-07-18 21:48:27

+0

Plz检查我的更新。感谢您的回复。 – Sara 2012-07-18 21:54:03

相关问题