JUnit 4基本功能

5
使用JUnit 4创建测试用例并使用公共功能的正确方法是什么:例如,对于多个单元测试类都通用的设置。我的做法是创建一个测试用例并将公共功能放在@Before方法中,然后需要这些功能的任何测试用例都会扩展基类。然而,这似乎要求在每个子类中执行super.setUp()
有更好的方法吗?
编辑
实际上,我的解决方案不起作用。有时JUnit会调用基类两次。一次是如果它首先在基类上运行测试,另一次是当它到达子类时(至少我认为是这样)。因此,“继承”公共测试用例功能的更好方法将是很好的选择。
4个回答

5
如果您使用@Before注释,则无需调用super.setup()
在编写测试时,通常会发现多个测试需要创建类似的对象才能运行。将公共void方法注释为@Before会使该方法在测试方法之前运行。超类的@Before方法将在当前类的@Before方法之前运行。
我建议像这样:
  @Before
  public void initForAll() {}

在超级/主类中,以及任何其他类中。
  @Before
  public void initTest() {...}

在你的测试用例中。

编辑:

回答你编辑中的问题:

  1. 你可以使用@BeforeClass,它将每个TestClass调用一次。
  2. 但我认为你正在寻找类似于延迟/静态初始化的东西。

我是这样做的:

private boolean initialized = false;

@BeforeClass
public static void init()
{
  if(initialized)
  {
    return;
  }

  //Initialize everything

  initialized = true;
}

2
如果两个带注释的 @before 方法具有相同的名称,则子类将覆盖超类中的一个,因此需要调用 super.setUp,我想。 - hlm
2
我建议您给超级方法一个特殊的名称,以便您不会重复使用。注释方法的名称并不重要,只需选择不同的名称即可。 - oers
1
为什么这个答案没有被接受呢?它是否解决了帖子中的问题? - me_digvijay

0

这是一个相当不错的方法。如果你在子类中有一个setUp(),那么是的,你必须调用super.setUp(),但实际上,这有多难呢?


0
你尝试过其他方法吗? 不要创建一个具有共同功能的基类,而是创建一个带有静态方法的工具类,该静态方法将提供共同的功能。然后在每个测试用例的@Before注释方法中调用util方法即可。

0
如果你的基类有一个公共方法public void setUp(),而你的子类也有一个同名同签名的setUp方法,那么子类的setUp方法覆盖了基类的方法,只会调用子类的方法(可能在应该调用基类方法时调用子类方法,这一点不确定)。
解决方案是将基类的setup方法命名为其他名称,例如baseSetup()。然后它们都会自动被调用。Joachim的答案确实涉及到了命名问题,但我想更清楚地说明方法覆盖的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接