我试图使用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的标签,这就是为什么没有调用设置方法的原因。我希望这对未来的用户有所帮助。
答案 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)
此处的问题是您的变量范围baratheons
和starks
。
阅读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));
}
}