2013-11-14 69 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 *的原因。:) 但是,感謝您的好消息,希望對他有用。 –