JUnit:调用@After将对象设置为Null

时间:2014-05-15 17:55:46

标签: java junit

假设我有以下简单的JUnit测试

private Person person;

@Before
public void createObject()
{
   String firstName = "John";
   String lastName = "Doe";

   person = new Person(firstName, lastName);
}

@Test
public void test1()
{
   assert(firstName.equals("John"));
}

@Test
public void test2()
{
   assert(lastName.equals("Doe"));
}

我应该有一个设置person = null的@After方法吗?

我在没有@After方法的情况下尝试了类似的测试,我似乎无法弄清楚它是否有任何优点或缺点。

忽略测试名称不是很有意义。我刚刚发布了一个简单的例子。

4 个答案:

答案 0 :(得分:4)

你可以,但没有任何意义。在每次测试运行之前调用@Before方法。 Person将使用@After进行GC {{1}}。

答案 1 :(得分:4)

不,那没用。测试完成后,测试类实例超出范围,并符合GC的条件。因此,如果VM决定,您的测试及其人员将被垃圾收集。

您通常使用@After,就像使用finally块一样:关闭需要关闭的资源,无论测试方法的结果如何。

答案 2 :(得分:2)

不,在这种情况下,没有必要在测试后运行拆卸方法。在JUnit中,每个测试方法都是单独实例化的,并且在运行测试之后,您的Person字段将被收集垃圾。现在,如果您正在通过流或其他方式触摸某种外部资源,您可能希望在测试结束时或在拆卸方法中确保并关闭它。

答案 3 :(得分:1)

不,你不必从[see @JBNizet's answer]开始。

话虽如此:使用这些类型的构造函数和析构函数(概念类型,而不是语言提供的类型)容易出现问题,因为正是这个问题:你必须记住每个对象的状态以及它是如何形成的影响应用程序的全局状态。

我更喜欢的另一种方法是使用一个返回该对象的简单工厂方法:

private Person getPerson(){
    return new Person("John", "Doe");
}

现在你可以在每个测试中使用它,你不再依赖任何一个州。

@Test
public void test1()
{
   Person person = getPerson();
   assert(person.getFirstName().equals("John"));
}