java - 如何对复杂类进行 Java 单元测试

标签 java unit-testing junit mocking junit4

我在弄清楚如何通过单元测试解决问题时遇到了困难。我几乎没有“单元测试”经验。只有在绝对必要时,我才会尝试更改 classUnderTest,并且更改最少。

我正在使用 JUnit 4 , 我愿意尝试使用 Mockito , JMockit或任何其他有助于高效且有效地进行单元测试的库。我正在为数据库使用 JDBC

问题:

classUnderTest 中,我正在访问一个静态 数据库。

SpecializedDao specializedDao = SpecializedDao.getSpecializedDao();
ObjectX objectResult = specializedDao.currentObjectXByTimestamp(x, x, x, x, x, x);

我正在尝试使用具有有效配置和无效配置的单元测试用例。解决此问题的正确方法是什么。

我研究过的一些可能解决方案是:

  1. 以某种方式传入或“注入(inject)”类 ObjectX 的假 ObjectXResult
  2. 模拟一个数据库(如果甚至可能使用静态数据库引用,使用单独的单元测试 servlet 来引用一个假的 SpecializedDao 类?)
  3. 使用Mockito使用 injectMocksspywhen(methodcallwithparameters) thenReturn result 或其他实现 Mockito提供。
  4. 接受任何其他解决方案。

问题:

classUnderTest 中,我正在使用另一个复杂的处理 class2 来完成很多工作,如下所示:

result = class2.execute(x, x, x, x, x, x);

class2 处理内容并返回结果 ENUM 或一些异常。我如何通过将此特定单元测试的范围 保留在 classUnderTest 上来处理此问题。 class2 访问数据库,并做了很多工作,这就是为什么它是它自己的类,但我认为最后三个测试用例依赖于彻底测试 classUnderTest 的处理>.

感谢您的耐心等待,我已尝试尽可能清楚地提出问题。

最佳答案

一个好的规则是永远不要从您的 JUnit 连接到外部源。 任何执行的操作,例如数据库连接,您都可以使用 Mockito 模拟它们。

使用 Mockito,您可以模拟所有您不想测试的类。在您的情况下,您可以模拟那些繁重的类(class)并返回预期结果。

关于java - 如何对复杂类进行 Java 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46492468/

相关文章:

java - 通过 JOptionPane.showInputDialog 在标题中使用自定义图标

java - 将 MIDI 转换为 Java 数据结构(List、Hash Map、???)

c - Vala 的单元测试框架

api - 不同语言的相同测试

java - 使用 Java 对客户端-服务器应用程序进行单元测试

java - signature.verify() 总是返回 False?

Java 运行时错误 - java.lang.NoClassDefFoundError 名称错误

c# - 断言字符串数组成员内容

java - 如何使用 junit 和 easymock 模拟静态方法

junit - 如何在junit中给多部分文件输入