【问题标题】:JUNIT Null Pointer ExceptionJUNIT 空指针异常
【发布时间】:2013-11-14 13:18:35
【问题描述】:

这是我第一次使用 JUNIT,我真的无法让它工作。

我有一个 person 类,其中包含 firstName 和 lastName,还有一个测试类,我需要在其中测试方法。但是,每次我尝试测试一个时,如果我为特定方法编写了一个测试,它就会失败。

这是我的代码。

人员类

public class Person {
    private String firstName;
    private String lastName;    

    public Person (String a, String b) {
        firstName = a;
        lastName = b;
    }

    public String getfirstName() {
        return firstName;
    }

    public void setfirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getlastName() {
        return lastName;
    }

    public void setlastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return  firstName + " " + lastName;
    }
}

人物测试类

public class PersonTest {
    Person p1;

    public PersonTest() {
        Person p1 = new Person ("Thomas", "Brown");
    }

    @Before
    public void setUp() {}

    @After
    public void tearDown() {}

    @Test
    public void testGetfirstName() {
        assertEquals("Thomas", p1.getfirstName());
    }

    @Test
    public void testSetfirstName() {}

    @Test
    public void testGetlastName() {
        assertEquals("Brown", p1.getlastName());
    }

    @Test
    public void testSetlastName() {}

    @Test
    public void testToString() {
        assertEquals("Thomas Brown", p1.toString());
    }
}

谁能指出我正确的方向?

【问题讨论】:

  • Person p1...的创建移动到你的@Before方法中。

标签: java testing junit


【解决方案1】:

这是正确的做法:

@Before
public void setUp() {
    p1 = new Person ("Thomas", "Brown");
}

您的代码中有 2 个问题。

public PersonTest() {
    Person p1 = new Person ("Thomas", "Brown");
}

这将创建一个局部变量,并且您的字段 p1 保持为 null

第二个是在你的setUp方法中你没有初始化p1

您使用@Before 注释的方法将在每次测试之前运行,您应该将初始化放在那里。我还建议使用更具描述性的名称,因此您应该将 p1 更改为 target 或类似的名称。

编辑:对于您的 set... 方法,您可以执行以下操作:

public class PersonTest {
    private static final String TEST_FIRST_NAME = "some name";

    Person target;

    // ...
    @Test
    public void testSetFirstName() {
        target.setFirstName(TEST_FIRST_NAME);
        Assert.assertEquals(target.getFirstName(), TEST_FIRST_NAME);
    }
}

此时您可以假设 getFirstName 有效,因为您也对其进行了测试。

旁注:我认为只要使用 Eclipse 生成 getter 和 setter,就不必测试它们。这只是不必要的。

【讨论】:

  • 非常感谢。我也对如何测试集方法感到困惑?你能指出我正确的方向吗?
  • 如果您的生产类正在断言输入和/或有效状态,您可能需要测试您的访问器/突变器。
  • 这是验证器类或类似的工作,不是吗?
  • 是的,但并非所有系统都使用外部验证器类来处理简单的事情,例如 nulls 和空字符串。
  • 这可能有点矫枉过正,但在我之前工作的系统上,我们创建了一个NonNullParametrized 方面,它检查业务外观中的所有方法,如果用户提供null,则抛出异常。在这种情况下,我们只需要测试方面而不是所有方法。归根结底,相同结果的工作量要少得多。
【解决方案2】:

改变

Person p1 = new Person ("Thomas", "Brown"); //this is local variable

 p1 = new Person ("Thomas", "Brown");// and this will use the instance variable

【讨论】:

  • 虽然删除此别名是正确的,但在测试构造函数(仅创建一次)而不是在 @Before 方法(其中它为每个@Test 初始化)。如果您使用构造函数方法并且在任何时候修改被测类,那么您将为您的所有@Test 方法引入副作用。
  • 好记,其实我对JUnit并不熟悉,我只知道NullPointerException的原因 :) 不过感谢提供的好信息,希望对你有用为他。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2021-06-15
  • 2018-08-27
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多