如何将命令行参数传递给 Junit 测试

How to pass command line arguments to Junit Test

我有一个接受命令行参数的主 class,我正在将此参数传递给另一个 class。现在我必须用参数测试 myClass。我有 JUnit 来测试它,但我想知道如何在测试中通过它

public class JsonFileTest {
    public static void main(String[] fileNames) {
        myClass class = new myClass(fileNames);
    }
}

我是 JUnit 的初学者并且正在学习它,所以如果有任何指导将不胜感激。我需要将文件名传递给 class 方法。

您似乎 counter-intuitive 想要以这种方式参数化您的单元测试。我建议您考虑几组参数并在单元测试中对它们进行硬编码。这样它们是可重复的,并且有望提供良好的覆盖率。

您不需要将命令行参数传递给您的 JUnit 执行。相反,您的测试方法应该 build/prepare 一切,并使用您的原始程序在使用命令行参数时执行的参数调用您的 new myClass(...) 构造函数。代码可能如下所示:

@Test
public void checkForWhatever() {
    // prepare everything here like create a temp file
    File x = ...;
    String filename = x.getName(); // or maybe even x.getAbsolutePath();

    String[] arguments = new String[1];
    arguments[0] = filename;

    // now call your constructor
    myClass obj = new myClass(arguments);

    // do any checks here now
    Assertions.assertTrue(obj.getWhatever());
    // ...
}

对新手有用的几个要点:

  1. 您不能在 Java 中命名对象 "class"。

  2. 建议遵循Java命名规范,因此class名称应以大写字母开头。

现在,关于命令行参数。 您的代码中有答案:

public static void main(String[] fileNames) {

String[] fileNames - 是命令行参数数组。

因此,要为您的方法提供一些参数,请使用您需要的参数对其进行初始化。

类似于:

@Test
public void testMainMethod(){
   JsonFileTest.main(new String[]{"file1", "file2"});
}

但在现实生活中,测试一个main方法并不是一个好主意。它 returns 什么都没有,所以你只能创建一些测试来检查它 throws/doesn 没有抛出一些异常。 这个想法是测试整个逻辑。在本例中,对象构造:

@Test
public void testConstructor(){
   myClass class = new myClass(new String[]{"file1", "file2"});
   /* Your assertions here */

}

我想将参数传递给 @BeforeAll 方法以创建丢失的目录。

多个项目依赖这些目录,但项目位于不同的位置:

  1. "C:/Workspace/Project1"
  2. "C:/Workspace/Project2"
  3. "C:/Users/Test/Project3"4
  4. 等等

我想将文件路径作为变量传递给 JUnit 方法,以便它可以在内部为每个项目创建 Log、Temp、Input 等。我如何使用 cli 执行此操作?我试过:

  java -jar junit-platform-console-standalone-1.5.2.jar --class-path out --scan-class-path "C:\Workspace\Project1"

此外,我有一个带参数的构造函数:

    public class ConnectIntegrationTest {

        private String workspace;


        public ConnectIntegrationTest(String localWorkspace) {
            this.workspace = localWorkspace;
        }

@BeforeAll
    void setupMissingDirectories() throws Exception {

我一定是漏掉了什么...