2013-11-14 66 views
0

这是我第一次使用JUNIT,并且我实际上无法使它工作。JUNIT空指针异常

我有一个人类,其中有firstName和lastName,以及我需要测试方法的测试类。每次我试图测试一个,如果我已经为特定的方法写了一个测试,它就会失败。

这是我的代码。

Person类

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

移动'人P1 ...'的创建到你的'@ Before'方法。 –

回答

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。这只是非民主的。

+0

非常感谢。我也对如何去测试设置方法感到困惑?你能指出我在正确的方向吗? – AnjunaTom

+0

如果您的生产类别声明输入和/或有效状态,则可能需要测试访问器/增变器。 –

+0

这是验证器类或类似的工作,不是吗? –

3

变化

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

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

虽然删除这个别名是正确的,但在测试构造函数中(它只创建一次)而不是在'@ Before'方法中初始化被测试的类通常是不正确的形式(对每个' @ Test')。如果您使用构造函数方法*和*,您可以在任何时候修改受测试的类,那么您将为所有'@ Test'方法引入副作用。 –

+1

好消息,实际上我对'JUnit'不熟悉,我刚刚知道* NullPointerException *的原因。:) 但是,感谢您的好消息,希望对他有用。 –