空指针异常-JAVA Mockito



可能只是我是盲人,但为什么我在"when(sqldumm.getAllMembers()).thenReturn(mockedMemberList);"处得到一个null指针异常?第一次尝试Mockito,所以我可能有糟糕的实现。(我不太确定)。

我已经失明一段时间了。系统外调试除了为空之外没有产生任何实际信息。

我尝试将整个代码从@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));
}

您混合了Junit3的TestCase和JUnit4的@Before和@After注释。

看看TestCase的javadoc,你会读到:

测试用例定义了运行多个测试的夹具。定义测试用例

1.实现TestCase的子类
2.定义存储夹具状态的实例变量
3.通过重写setUp()来初始化fixture状态
4.通过重写tearDown()在测试后进行清理。

因此,要使此代码工作,您必须:

选项1:不扩展TestCase并为assertTrue导入org.junit.Assert

选项2:将before()的名称更改为setUp();将after()的名称更改为tearDown();移除@Test@Before@After注释。

上面的任何选项都应该有效,但我建议您使用第一个选项(原因在上面的链接中)。

附言:你不需要让你的字段是静态的;)

最新更新