JUnit 4基本功能

时间:2011-06-07 19:22:52

标签: unit-testing junit4

JUnit 4创建测试用例以使用通用功能的正确方法是什么:例如几个单元测试类通用的设置?我所做的是创建一个测试用例并将通用功能放在@Before方法中,然后任何需要它的测试用例都会扩展基类。但是,这似乎需要在每个子类中执行:super.setUp()

有更好的方法吗?

修改

实际上我建议的解决方案不起作用。有时JUnit会调用基类TWICE。一旦它碰巧首先在基类上运行测试,并且当它到达子类时再次运行(至少我认为这是发生的事情)。因此,“继承”常见测试用例功能的更好方法将非常棒。

4 个答案:

答案 0 :(得分:5)

如果您使用@Before annotation

,则无需调用super.setup()
  

编写测试时,通常会发现需要进行多项测试   他们之前创建的类似对象   能跑。诠释公共空白   使用@Before的方法会导致该方法   在Test方法之前运行。该   超类的@Before方法会   在当前的那些之前运行   类。

我建议这样的事情:

  @Before
  public void initForAll() {}

在super / Main类

和任何

  @Before
  public void initTest() {...}

在你的测试用例中。

编辑:

在编辑中回答您的问题。

  1. 您可以使用@BeforeClass,每个TestClass将调用一次private boolean initialized = false; @BeforeClass public static void init() { if(initialized) { return; } //Initialize everything initialized = true; }
  2. 但我认为你正在寻找类似懒惰/静态初始化的东西。
  3. 我是这样做的:

    {{1}}

答案 1 :(得分:0)

这是一个非常好的方法。如果你在子类上有setUp(),那么是的,你必须调用super.setUp(),但实际上,这有多难?

答案 2 :(得分:0)

您是否尝试过其他方法? 不是使用通用功能创建基类,而是使用静态方法创建一个具有常用功能的util类。然后在每个测试用例的@Before注释方法中调用util方法。

答案 3 :(得分:0)

如果你的基类有一个方法public void setUp(),你的子类也是如此,那么子类的setUp方法会覆盖基类的同名和签名方法,所以只调用子类的方法(并且可以在调用基类的方法时调用它;不确定这个)。

解决方案是调用基类设置方法,例如: baseSetup()。然后他们都会被自动调用。 Joachim的答案确实解决了命名问题,但我想更清楚地了解方法覆盖的效果。