我试图使用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));
}编辑:
注:除了遵循以下解决方案中概述的步骤之外,我还想为后人指出,我在设置时也使用了错误的标记。由于这是JUnit 5,标记为@BeforeEach。前面是JUnit 4的标记,这就是为什么没有调用安装方法的原因。我希望这对未来的用户有帮助。
发布于 2018-04-25 15:21:09
这里的问题是在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方法。
发布于 2018-04-25 15:17:48
从static方法中删除setUp。
也是
Lord baratheons[] = new Lord[3];应该只是
baratheons = new Lord[3];starks也是如此。
发布于 2018-04-25 15:22:48
setUp()不应该是静态的。
在setUp()方法中实例化的数组分配给局部变量。
Lord baratheons[] = new Lord[3];您在这里声明的变量正在隐藏类属性。您应该移除这里的类(Lord),以便将新数组分配给好变量。
baratheons = new Lord[3];也要小心您的断言声明:
assertEquals(baratheons[0].getRelationship(), (x+=10));这个语句是有效的,但是在这里使用'+=‘语法可能会导致错误。在这种情况下,代码非常简单,但是如果您想要更改x的值,那么提取语句'x+=10‘就会变得清晰起来。如果不需要更改值,则可以使用x+10。
https://stackoverflow.com/questions/50025583
复制相似问题