当我的代码不使用 ArrayLIst 时,为什么 ArrayList.java 会出现 NullPointerException 错误?

got*_*otj 0 java testing junit unit-testing arraylist

所以我有两段Java代码。一个是一小段简单的源代码,另一个是我试图弄乱的 JUnit 测试类。但是,每当我想要调试代码以确保这个简单的代码正确显示时,我都会在 java.util.ArrayList.forEach(ArrayList.java:1507) 错误处收到 NullPointerException。

这是我的源代码:

public class sourceCode {
    public int mid(int x, int y, int z) {
        int m = z;

        if (y < z) {
            if (x < y) {
                m = y;
            }
            else if (x < z) {
                m = x;
            }
        }
        else {
            if (x > y) {
                m = y;
            }
            else if (x > z) {
                m = x;
            }
        }
        return m;
    }
Run Code Online (Sandbox Code Playgroud)

}

这是我的 JUnit 测试用例代码:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.Before;
import org.junit.jupiter.api.Test;

public class sourceCodeTest {
      public sourceCode sourceCodeVar;

      //Test Fixture
      @Before
      public void setUpBeforeClass() throws Exception {
            sourceCodeVar = new sourceCode();
      }

      @Test
      void test() {
          //Test Oracle
          int oracle = 2;
          //Test Case
          int middleTest1 = sourceCodeVar.mid(1, 2, 3);
          assertEquals(oracle, middleTest1);
      }

}
Run Code Online (Sandbox Code Playgroud)

发现

它们都是同一目录下的不同文件,它们也是在 Eclipse 的项目中创建的。我在另一个稍微相关的线程中看到它可能是与 Eclipse 相关的错误,但是在 VS Code 上测试它时,出现了相同的错误,这表明这是我的错误。

我想我如此困惑的原因是代码似乎太简单了,我无法确定我搞砸的地方。

ruh*_*hul 5

您似乎在测试代码中混合了JUnit-4JUnit-5 。

\n\n
import org.junit.Before;            // <- Junit-4 annotation\nimport org.junit.jupiter.api.Test;  // <- Junit-5 annotation\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您用于Junit-5测试时,最好使用所有Junit-5注释。替换@Beforeorg.junit.jupiter.api.BeforeEach-> @BeforeEach

\n\n

你的代码应该是这样的:

\n\n
import static org.junit.jupiter.api.Assertions.*;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\n\npublic class sourceCodeTest {\n      public sourceCode sourceCodeVar;\n\n      // change:\n      @BeforeEach\n      public void setUpBeforeClass() throws Exception {\n            sourceCodeVar = new sourceCode();\n      }\n\n      @Test\n      void test() {\n          //Test Oracle\n          int oracle = 2;\n          //Test Case\n          int middleTest1 = sourceCodeVar.mid(1, 2, 3);\n          assertEquals(oracle, middleTest1);\n      }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多信息,请查看此文档:

\n\n
\n

@BeforeEach

\n\n

表示被注解的方法应该在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行;类似于 JUnit 4\xe2\x80\x99s @Before。除非重写这些方法,否则它们是继承的。

\n
\n