如何将命令行参数传递给 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());
// ...
}
对新手有用的几个要点:
您不能在 Java 中命名对象 "class"。
建议遵循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 方法以创建丢失的目录。
多个项目依赖这些目录,但项目位于不同的位置:
- "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 {
我一定是漏掉了什么...
我有一个接受命令行参数的主 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());
// ...
}
对新手有用的几个要点:
您不能在 Java 中命名对象 "class"。
建议遵循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 方法以创建丢失的目录。
多个项目依赖这些目录,但项目位于不同的位置:
- "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 {
我一定是漏掉了什么...