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

4
假设我有以下简单的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"));
}

我应该编写一个@After方法来设置person = null吗?

我尝试过没有@After方法的类似测试,但是我无法确定将其放在那里是否有任何优点或缺点。

请忽略测试名称不太有意义的事实。我只是发布一个简单的示例。

4个回答

5
您可以这样做,但是没有意义。 @Before方法会在每次测试运行之前被调用。 Person 在使用和不使用 @After的情况下都会被 GC 回收。

谢谢!这正是我所想的,但我并不完全确定。 - Rhs

5

不,那是无用的。一旦测试完成,测试类实例就会超出范围,并且有资格进行垃圾回收。因此,如果虚拟机决定这样做,您的测试及其人员将被垃圾回收。

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


2

不需要在这种情况下运行测试后的拆解方法。在JUnit中,每个测试方法都是单独实例化的,当测试运行结束后,您的Person字段将被垃圾回收。现在,如果您正在触及某种外部资源,比如通过流或其他方式,您需要确保在测试结束时关闭它,或者在拆解方法中关闭。


1
不,你不必这样做,因为 [请参见@JBNizet的答案]
话虽如此:使用这些类型的构造函数和析构函数(概念上的种类,而非语言提供的种类)容易出现问题,因为正是由于这个问题:你必须记住每个对象的状态以及它如何影响应用程序的全局状态。
我更喜欢使用一个简单的工厂方法来返回该对象。
private Person getPerson(){
    return new Person("John", "Doe");
}

现在你可以在每个测试中使用这个,你不再依赖于任何状态了。
@Test
public void test1()
{
   Person person = getPerson();
   assert(person.getFirstName().equals("John"));
}

2
每个测试方法JUnit都会为其创建一个新的测试类实例,因此它不会被Before覆盖。 - JB Nizet

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