目前我有一个名为TestSuite.java
的现有JUnit测试套件。
然后我使用BufferedWriter
并生成一个名为TestSuiteMinimized.java
的新Java文件。
然后,我使用一个运行带有必要类路径的javac
命令的进程以编程方式编译该文件。
现在的问题是我似乎无法运行这个新创建的Java文件。
private static Map<String, String> runJavaFile(String filePath) {
Class<?> test;
try {
test = Class.forName(getClassName(filePath), true, ClassLoader.getSystemClassLoader());
} catch (ClassNotFoundException e) {
System.err.println("Class not found in file: " + filePath);
e.printStackTrace();
System.exit(1);
return null;
}
// Map from method name to failure trace.
Map<String, String> runResultMap = new HashMap<String, String>();
Result result = JUnitCore.runClasses(test);
for (Failure failure : result.getFailures()) {
runResultMap.put(failure.getDescription().getMethodName(), removeLineNumbersFromTrace(failure.getTrace()));
}
return runResultMap;
}
当我第一次运行仅存在TestSuite.java并且尚未创建TestSuiteMinimized.java的程序时,我得到一个ClassNotFoundException:
Class not found in file: C:\Users\Wayway\workspace\Project1\src\TestSuiteMinimized.java
java.lang.ClassNotFoundException: TestSuiteMinimized
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at Project1.runJavaFile(Project1.java:739)
at Project1.mainMinimize(Project1.java:176)
at Project1.main(Project1.java:105)
但是,如果我在编写和编译TestSuiteMinimized.java后再次运行该程序,则会加载并且ClassNotFoundException消失。但是,我在多次迭代中写入TestSuiteMinimized.java,看起来新版本的TestSuiteMinimized.java没有运行。相反,只加载了第一个版本的TestSuiteMinimized.java。
这似乎是一个ClassLoader问题,但上面的Class.forname(...)方法似乎没有加载该类。
什么是正确的方法?谢谢!
答案 0 :(得分:0)
我不确定使用JUnit,但我发现这样做的最简单方法是导出您尝试作为可执行JAR文件运行的类,并通过命令行执行它,如下所示:
String cmd = "java - jar NAME OF YOUR PROGRAM.JAR";
try {
//Execute the command
Runtime.getRuntime().exec(cmd);
counter++;
} catch (IOException e) {
e.printStackTrace();
}
您调用的程序需要与调用它的程序位于同一目录中,或者它需要是您尝试运行的jar文件路径。
就像我说的那样,我不确定运行JUnit文件,但是如果你可以将它们导出为可执行的jar,那么它应该是同样的想法。