我想对struts操作设置单元测试,这些操作正在处理从Web表单上传的Excel工作表。 我选择 strutstest 库并将其与 cactus 框架一起使用。 仙人掌本身没有多部分请求选项。所以我又使用了一个库并推荐了cactus网站的解决方法。
public class ActionTest extends CactusStrutsTestCase {
NVPair[] hdrs = new NVPair[1];
//this method prepares request
public void beginFileUpload(WebRequest req) {
NVPair[] opts = { new NVPair("MAX_FILE_SIZE", "20485760") };
NVPair[] file = { new NVPair("myFile", "D://temp//TEST.xls") };
try {
byte[] data = Codecs.mpFormDataEncode(opts, file, hdrs);
InputStream i = new ByteArrayInputStream(data);
req.setUserData(i);
req.setContentType(hdrs[0].getValue());
i.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
此处 NVPair 和编解码器是推荐库中的类。 当文件数据传递到服务器端的apache POI框架时,我得到以下异常:
POIFSFileSystem poifs = new POIFSFileSystem(istTest);
...
java.io.IOException: Invalid header signature; read 0xC8001A0031006C00, expected 0xE11AB1A1E011CFD0
据我所知,文件数据已损坏,因为多部分请求未正确编码。 我使用的文件很好。我用不同的方式用 apache commons httpclient 库测试了它:
HttpClient httpclient = new DefaultHttpClient();
try {
HttpPost httppost = new HttpPost("http://localhost:9080" +
"/retrieveData.do?background=yes");
FileBody bin = new FileBody(new File("D://temp//TEST.xls"));
//MultipartEntity reqEntity = new MultipartEntity(); this no param constructor also leads to exception
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, "47436622^%2824349", Charset.forName("ISO-8859-1"));
reqEntity.addPart("bin", bin);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
System.out.println("Response content length: " + resEntity.getContentLength());
}
EntityUtils.consume(resEntity);
} finally {
try { httpclient.getConnectionManager().shutdown(); } catch (Exception ignore) {}
}
但这种方法测试连接。我需要利用仙人掌来评估行动执行结果。 任何建议都表示赞赏!