当前位置: 首页 > 面试题库 >

setUp / tearDown(@ Before / @ After)为什么我们在JUnit中需要它们?

林鸿飞
2023-03-14
问题内容

我相信大家都知道setUp(@Before)将在任何测试方法之前执行,而tearDown(@After)将在测试方法之后执行。

我们也知道Junit会为 每个测试方法 创建一个Test实例。

我的问题是,我们可以只将setUp方法的内容移至类Constructor并删除setUp方法吗?是否有任何特定理由保留setUp方法?


问题答案:

这篇(旧的)JUnit最佳实践文章将其描述如下:

不要使用测试用例构造函数来设置测试用例

在构造函数中设置测试用例不是一个好主意。考虑:

      public class SomeTest extends TestCase
>        public SomeTest (String testName) {
>           super (testName);
>           // Perform test set-up
>        }
>     }

想象一下,在执行设置时,设置代码会抛出一个 IllegalStateException。作为响应,JUnit将抛出一个
AssertionFailedError,指示无法实例化该测试用例。这是生成的堆栈跟踪的示例:

>     junit.framework.AssertionFailedError: Cannot instantiate test case:
> test1  
>         at junit.framework.Assert.fail(Assert.java:143)
>         at junit.framework.TestSuite.runTest(TestSuite.java:178)
>         at junit.framework.TestCase.runBare(TestCase.java:129)
>         at junit.framework.TestResult.protect(TestResult.java:100)
>         at junit.framework.TestResult.runProtected(TestResult.java:117)
>         at junit.framework.TestResult.run(TestResult.java:103)
>         at junit.framework.TestCase.run(TestCase.java:120)
>         at junit.framework.TestSuite.run(TestSuite.java, Compiled Code)
>         at junit.ui.TestRunner2.run(TestRunner.java:429)

该堆栈跟踪被证明是无用的。它仅表示无法实例化测试用例。它没有详细说明原始错误的位置或来源。信息的缺乏使得很难推断出异常的根本原因。

代替在构造函数中设置数据,而是通过覆盖进行测试设置setUp()setUp()正确报告任何抛出的异常。将此堆栈跟踪与之前的示例进行比较:

>     java.lang.IllegalStateException: Oops
>         at bp.DTC.setUp(DTC.java:34)
>         at junit.framework.TestCase.runBare(TestCase.java:127)
>         at junit.framework.TestResult.protect(TestResult.java:100)
>         at junit.framework.TestResult.runProtected(TestResult.java:117)
>         at junit.framework.TestResult.run(TestResult.java:103)
>         ...

该堆栈跟踪信息更多。它显示了引发了哪个异常(IllegalStateException)以及从何处引发的异常。这使得解释测试设置的失败变得容易得多。



 类似资料:
  • 问题内容: 我有一个集成测试套件。我有一门课可以扩展我的所有测试。该基类具有()和()方法来建立API和数据库连接。我一直在做的只是在每个测试用例中覆盖这两个方法,并调用和。但是,如果有人忘记调用super或将它们放置在错误的位置并抛出异常,并且他们忘记在final或某物中调用super,则这可能会导致问题。 我想做的是在基类上创建和方法,然后仅添加我们自己的注释和方法。进行一些初始测试后,似乎总

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 问题内容: 我对Maven快照的含义以及为什么要构建一个快照感到困惑。 问题答案: Maven中的快照版本尚未发布。 这个想法是,前一个版本(或任何其他版本)完成后,存在一个。那个版本可能会变成 。它基本上是“ 开发中”。这可能接近实际发行版,或相当遥远(0.9例如,发行后立即发行)。 “真实”版本和快照版本之间的区别在于快照可能会得到更新。这意味着今天下载的文件可能不同于昨天或明天下载的文件。

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?

  • 为什么我们需要字典? 计算机最适合使用数字,而人类最适合使用姓名。我们创建了DNS以便记住主机名而不是IP地址。字典以相同的方式使用,因此我们可以记住AVP名称而不是类型编号。当FreeRADIUS解析请求或生成响应时,会查阅字典。 但是,字典与DNS不同,因为RADIUS客户端不知道FreeRADIUS使用的这些“友好”名称。永远不会在RADIUS客户端和RADIUS服务器之间交换AVP名称。