struts动作测试中的文件上传问题

时间:2012-10-23 15:34:04

标签: java servlets junit struts apache-poi

我想对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) {}
   }

但这种方法测试连接。我需要利用仙人掌来评估行动执行结果。 任何建议都表示赞赏!

0 个答案:

没有答案