2015-11-23 68 views
-3

可能只是我失明,但爲什麼我會在「when(sqldummy.getAllMembers())。thenReturn(mockedMemberList);」時得到一個空指針異常? 第一次嘗試Mockito,所以我可能會有不好的實現。 (我不太確定)。Nullpointer異常 - JAVA Mockito

我一直在盲目地盯着自己一會兒。系統輸出調試沒有產生任何除null之外的真實信息。

我試着將整個代碼從@before移到實際的方法中,並且它在那裏工作。但是這很醜陋,@Before就是這樣處理重複的代碼,否則我必須添加到我創建的其他每個測試方法中。

請幫忙。

public class TestShipHandling extends TestCase{ 

private static ShipHandling shipHandling; 
private static SQLDUMMY sqldummy; 
private static ArrayList<Member> mockedMemberList; 
private static ArrayList<Ship> mockedShipList; 


@Before 
public void before() { 
    sqldummy = mock(SQLDUMMY.class); 
    mockedMemberList = new ArrayList<>(); 
    mockedShipList = new ArrayList<>(); 
    shipHandling = new ShipHandling(sqldummy); //Instance shiphandling class with mocked SQLDUMMY 

    Member m1 = new Member(); 
    m1.setMemberFirstName("Max"); 
    m1.setMemberLastName("W0w"); 
    m1.setMemberID("MW222"); 
    mockedMemberList.add(m1); 

    System.out.println(mockedMemberList); 
    Member m2 = new Member(); 
    m2.setMemberFirstName("Andrew"); 
    m2.setMemberLastName("Gower"); 
    m2.setMemberID("AG222"); 
    mockedMemberList.add(m2); 

    Member m3 = new Member(); 
    m3.setMemberFirstName("Maximum"); 
    m3.setMemberLastName("Crispness"); 
    m3.setMemberID("MC999"); 
    mockedMemberList.add(m3); 

    Ship s = new Ship(); 
    s.setShipName("qweqwe"); 
    s.setShipClass("big"); 
    s.setShipGunCaliber(300); 
    s.setShipLength(200); 
    s.setShipNGuns(30); 
    mockedShipList.add(s); 

} 

@After 
public void after() { 
    System.out.println(mockedMemberList); 
    mockedMemberList.clear(); 
    mockedShipList.clear(); 
} 

@Test 
public void testAddShipReturnsTrue() throws Exception { 
    when(sqldummy.getAllMembers()).thenReturn(mockedMemberList); 

    Member tempMem = sqldummy.getAllMembers().get(0); 

    String shipName = "Victorium"; 
    String shipClass = "Battleship"; 
    int shipGunCaliber = 305; 
    int shipLength = 320; 
    int shipNGuns = 10; 

    assertTrue(shipHandling.addShip(tempMem, shipName, shipClass, shipGunCaliber, shipLength, shipNGuns)); 
} 
+0

請在標題 – arisalexis

+0

我想'shipHandling.addShip'正在訪問的sqldummy方法返回null,則使用唯一信息。 –

+0

更改此行成員tempMem = sqldummy.getAllMembers()。get(0); to List list = sqldummy.getAllMembers(); Member tempMem = list.get(0); – mvlaicevich

回答

1

你是mixing Junit3's TestCase and JUnit4's @Before and @After annotations

展望javadoc of TestCase閱讀:

測試用例定義夾具運行多個測試。要定義一個測試用例

1.implement測試用例
其通過重寫設定()
4存儲夾具
3.initialize夾具狀態的狀態的實例變量的 2.define一個子類。通過重寫tearDown()進行測試後進行清理。

因此使此代碼工作,你必須:

選項1:不要延長TestCase並導入org.junit.AssertassertTrue

選項2:將名稱before()更改爲setUp();將after()的名稱更改爲tearDown();刪除@Test,@Before@After註釋。

上述任何選項都可以使用,但我建議您使用第一個選項(上述鏈接的原因)。

PS:你並不需要讓你的田靜)

+0

啊,是的!非常感謝!我從來沒有想過那個。根據我的經驗,NullPointers一直是一個愚蠢的錯誤,就像在初始化或使用錯誤的實例或沿着這些行的東西中一樣。謝謝你,先生! – Danny

+0

不客氣:) – Willian