【问题标题】:How to pass command line arguments to Junit Test如何将命令行参数传递给 Junit Test
【发布时间】:2019-09-25 03:15:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: java junit command-line-arguments


    【解决方案1】:

    对初学者有用的几点:

    1. 您不能在 Java 中将对象命名为“类”。

    2. 建议遵循Java命名约定,类名应以大写字母开头。

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

    public static void main(String[] fileNames) {
    

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

    所以要为你的方法提供一些参数,用你需要的参数初始化它。

    类似:

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

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

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

    【讨论】:

      【解决方案2】:

      您不需要将命令行参数传递给您的 JUnit 执行。相反,您的测试方法应该构建/准备所有内容,并使用原始程序在使用命令行参数时执行的参数调用您的 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());
          // ...
      }
      

      【讨论】:

        【解决方案3】:

        您想以这种方式参数化您的单元测试似乎违反直觉。我建议您考虑几组参数并在单元测试中对其进行硬编码。通过这种方式,它们是可重复的,并且有望提供良好的覆盖范围。

        【讨论】:

          【解决方案4】:

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

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

          1. “C:/Workspace/Project1”
          2. “C:/Workspace/Project2”
          3. “C:/Users/Test/Project3”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 {
          

          我一定是错过了什么……

          【讨论】:

            猜你喜欢
            • 2016-10-25
            • 2015-03-23
            • 2017-01-01
            • 1970-01-01
            • 2019-08-28
            • 1970-01-01
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            相关资源
            最近更新 更多