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

Java JUnit:调用@After将对象设置为Null,java,junit,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"));

假设我有以下简单的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方法的情况下尝试了一个类似的测试,但我似乎不知道把它放在那里有什么优点或缺点


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

你可以,但这毫无意义
@Before
方法在每次测试运行之前调用<代码>个人将在

之后进行GCed,包括和不包括。不,您不必这样做

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

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

private Person getPerson(){
    return new Person("John", "Doe");
}
现在,您可以在每个测试中使用它,不再依赖任何状态

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

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


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

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

谢谢!这正是我所想的,但我不能完全肯定它不会被以前的版本覆盖。JUnit为每个测试方法创建一个新的测试类实例。