在JUnit中初始化setUp()中的对象数组

时间:2018-04-25 15:03:57

标签: java arrays object junit

我试图使用setUp在JUnit中为我的测试方法初始化一个对象数组,但是我做错了,因为测试会抛出错误(空指针异常)。当我在测试方法中初始化数组时它们运行正常,但这显然不是理想的。谁能指出我在这里做错了什么?

class MainTest {

    Lord baratheons[];
    Lord starks[];

    //Setup & Teardown

    @Before
    static void setUp() throws Exception {
        Lord baratheons[] = new Lord[3];
        baratheons[0] = new Lord("Robert", 15);
        baratheons[1] = new Lord("Renly", -5);
        baratheons[2] = new Lord("Stannis", 30);
        System.out.println("Baratheons initialised!");

        Lord starks[] = new Lord[3];
        starks[0] = new Lord("Robb", -60);
        starks[1] = new Lord("Eddard", 0);
        starks[2] = new Lord("Jon", 90);
        System.out.println("Starks initialised!");
    }

    //Tests

    @Test
    void testGratefulLord() {
//      Lord baratheons[] = new Lord[3];
//      baratheons[0] = new Lord("Robert", 15);

        int x = baratheons[0].getRelationship();
        baratheons[0].giveFief();
        assertEquals(baratheons[0].getRelationship(), (x+=10));

    }

编辑:

N.B 除了遵循以下解决方案中列出的步骤之外,我还要为后人注意我也使用了错误的标签进行设置。由于这是JUnit 5,标签是@BeforeEach。 @Before是JUnit 4的标签,这就是为什么没有调用设置方法的原因。我希望这对未来的用户有所帮助。

4 个答案:

答案 0 :(得分:3)

这里的问题是您正在重新声明setUp()方法中的数组。这会弄乱您要使用的对象的范围。

static方法中删除setUp(),因为不需要。

更改您的代码
Lord baratheons[] = new Lord[3];
Lord starks[] = new Lord[3];

baratheons = new Lord[3];
starks = new Lord[3];

最后,您需要将方法更改为public。为什么?因为JUnit在幕后使用反射,所以它们需要公开才能识别。您可以查看JUnit JavaDoc并查看明确提及public void方法

答案 1 :(得分:1)

static方法中删除setUp

另外

Lord baratheons[] = new Lord[3];

应该只是

baratheons = new Lord[3];

同样适用于starks

答案 2 :(得分:0)

setUp()不应该是静态的。

您在setUp()方法中实例化的数组将分配给局部变量。

Lord baratheons[] = new Lord[3];

您在此处声明的变量是阴影您的类属性。你应该在这里删除这个类(主),将你的新数组分配给好的变量。

baratheons = new Lord[3];

还要小心你的断言:

assertEquals(baratheons[0].getRelationship(), (x+=10));

此语句有效,但此处使用'+ ='语法可能会导致错误。在这种情况下,代码非常简单,但如果要更改x的值,如果提取语句'x + = 10',则可以获得清晰度。如果您不需要更改该值,则可以使用x + 10。

答案 3 :(得分:0)

此处的问题是您的变量范围baratheonsstarks

阅读Scope of a Declaration上的Java规范,以便更好地理解该问题。

希望这有助于您更多地了解这个问题。

您的代码应如下所示:

class MainTest {

    private Lord[] baratheons;
    private Lord[] starks;

    //Setup & Teardown

    @Before
    public void setUp() throws Exception {
        baratheons= new Lord[3];
        baratheons[0] = new Lord("Robert", 15);
        baratheons[1] = new Lord("Renly", -5);
        baratheons[2] = new Lord("Stannis", 30);
        System.out.println("Baratheons initialised!");

        starks = new Lord[3];
        starks[0] = new Lord("Robb", -60);
        starks[1] = new Lord("Eddard", 0);
        starks[2] = new Lord("Jon", 90);
        System.out.println("Starks initialised!");
    }

    @Test
    public void testGratefulLord() {
        int x = baratheons[0].getRelationship();
        baratheons[0].giveFief();
        assertEquals(baratheons[0].getRelationship(), (x += 10));
   }
}