繁体   English   中英

空指针异常 - JAVA Mockito

[英]Nullpointer exception - JAVA Mockito

可能只是我瞎了,但为什么我会在“when(sqldummy.getAllMembers()).thenReturn(mockedMemberList);”处得到一个空指针异常? 第一次尝试 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));
}

您正在混合 Junit3 的 TestCase 和 JUnit4 的 @Before 和 @After annotations

查看您阅读的 TestCasejavadoc

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

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

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

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

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

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

PS:您不需要将字段设为静态;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM