JMeter Bean Shell Sampler错误" ...在类' java.nio.file.Paths"中找不到静态方法get(java.lang.String)复制文件时

时间:2017-05-26 20:28:04

标签: java jmeter beanshell

我正在尝试使用JMeter 3.0(Java v1.8)中的Bean Shell Sampler在本地计算机(Win 7)上复制和重命名文件。我们的想法是创建一个具有唯一名称的新文件,并将名称保存为变量,可用于代替FTP PUT请求中的文件名。

以下是我用于复制和重命名的代码:

import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);

Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx");
Path target = Paths.get("C:/dropfile/qatp/"+filename);

Files.copy(source, target, REPLACE_EXISTING);

我在日志中收到的错误:

  

错误 - jmeter.util.BeanShellInterpreter:调用bsh方法时出错:   eval源文件:内联评估:``import java.text。;进口   java.nio.file.StandardCopyOption 。 import java.io.IO。 。 。 '' :键入   变量声明:方法调用出错:静态方法get(   在类' java.nio.file.Paths'

中找不到java.lang.String

我一直在寻找这个问题的答案并遇到solution where the suggestion was: "我的猜测是问题是它没有填充varargs参数。尝试:

Path target = Paths.get(filename, new String[0]);"

我通过修改我的代码尝试了这个解决方案:

import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);

Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx", new String[0]);
Path target = Paths.get("C:/dropfile/qatp/"+filename, new String[0]);

Files.copy(source, target, REPLACE_EXISTING);

并收到此错误:

  

错误 - jmeter.util.BeanShellInterpreter:调用bsh方法时出错:   eval源文件:内联评估:``import java.text。;进口   java.nio.file.StandardCopyOption 。 import java.io.IO。 。 。 '' :键入   变量声明:方法调用Paths.get

有谁知道我为什么会遇到这个错误以及如何绕过它?

2 个答案:

答案 0 :(得分:2)

即使在普通的旧Java中,这也是对Paths.get的误导性使用,它使用URI或字符串数​​组(varargs)。 See javadoc

在Java中你尝试过的是有效的,因为静态类型允许编译器确定你传递的是一个String的数组。显然BeanShell没有并且感到困惑。在另一个答案中提出的诀窍在我看来并不是一个好的:再次在Java中它可以工作,通过连接两个字符串(第二个是空的,所以结果是第一个字符串,这是你想要的),但它会混淆BeanShell都是一样的,因为还有另一个带有2个参数的静态get方法。

如果您已将路径作为单个字符串,请尝试改为:

Path source = new File("C:/dropfile/qatp/QATP_GuestRecords.xlsx").toPath();

或者,您可以像这样使用Paths.get

Path source = Paths.get("C:", "dropfile", "qatp", "QATP_GuestRecords.xlsx");

或者像这样(varargs是帮助传递数组的语法糖):

Path source = Paths.get(new String [] { "C:/dropfile/qatp/QATP_GuestRecords.xlsx" });

将路径片段作为参数传递,或者将整个路径字符串作为单个参数传递是完全有效的,但这似乎会使BeanShell运行,因此,最好避免使用BeanShell中的Paths.get,除非您通过数组显式如上例所示。

答案 1 :(得分:0)

Beanshell!= Java ,它不支持所有Java功能(将其视为关于Java 1.5并适当修改代码。

所以我建议切换到JSR223 SamplerGroovy语言,Groovy更符合Java并且表现更好。

另请注意,您可以使用适用于Beanshell和/或Groovy的FileUtils.copyFile() method

import org.apache.commons.io.FileUtils;
import java.text.SimpleDateFormat;

String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date()) + ".xlsx";
FileUtils.copyFile(new File("/tmp/QATP_GuestRecords.xlsx"), new File("/tmp/" + filename));

有关在JMeter测试脚本中使用Groovy语言的更多信息,请参阅Groovy is the New Black文章。