【问题标题】: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】:
对初学者有用的几点:
您不能在 Java 中将对象命名为“类”。
建议遵循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 方法以创建缺失的目录。
多个项目依赖于这些目录,但项目位于不同的位置:
- “C:/Workspace/Project1”
- “C:/Workspace/Project2”
- “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 {
我一定是错过了什么……