JUNIT空指针异常

时间:2013-11-14 13:18:36

标签: java testing junit

这是我第一次使用JUNIT,但实际上我无法使用它。

我有一个人类,其中有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());
    }
}

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

这是正确的方法:

@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。这只是不必要的。

答案 1 :(得分:3)

更改

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

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