2011-06-03 58 views
1

我正在测试我的Java/Jersey Web服务并运行到一个有趣的测试用例中。我正在检查不同的URI条目的状态代码,以确保不正确的URI不会破坏我的代码或任何东西。在我抛出无效字符的测试用例中(例如!@ $#<>等),我的浏览器会像我期望的那样拉出404错误,但JUnit显示错误为500错误。发生这种情况时,我会抛出诸如“< 134->”之类的情况,并尝试注入html代码(例如“myURI<html><p>hello</p><br></html>/restofmyURI”)。连接到URI的单元测试连接

任何想法,为什么我会得到不同的服务器响应为同一个电话,和/或如何巩固答复?

+2

您是否在您的测试用例中编码了uri请求? – Kaj 2011-06-03 18:29:21

+0

我没去过。如果这是一个带有直接用户界面的网站,我会直接跳到这里,但是URI将从另一个服务中调用(我的web服务实际上是一个中间人,从数据库中读取数据并吐出XML),所以我不会“不知道他们的电话是否会被编码。你认为编码是导致差异的唯一因素吗? – ZKSteffel 2011-06-03 18:35:30

+0

可能,但我不能说这绝对是唯一的区别。 – Kaj 2011-06-03 18:48:03

回答

1

只想在我的过程中捆绑松散的末端。我最终不需要对我的测试进行编码,因为这些URL将直接被调用,而不是通过浏览器,但是在我意识到这一点之前,我已经有了一种编码方法。基于Kaj的建议(请参阅我的原始问题的评论),我将字符串编码为部分,将我需要的任何字符拆分为未编码(即针对此案例为:/)。这比我觉得它需要更复杂一些,但它达到了它的目的。

- 编辑:相关代码 -
这里是我的测试的方法,我称之为打开与服务器的连接(使用基本身份验证):

private void getConnection(String target, String user, String pass) throws Exception 
{ 
    URL url = new URL(target); 
    URLConnection conn = url.openConnection(); 
    //Here's where basic auth kicks in 
    String creds = user + ":" + pass; 
    String encoded = new sun.misc.BASE64Encoder().encode(creds.getBytes()); 
    conn.setRequestProperty("Authorization", "Basic " + encoded); 
    //This part doesn't rely on authentication 
    conn.connect(); 
} 

编码(如必要的)将在传递到这个方法之前完成。

+1

你也可能想检查这个优秀的帖子:[http-url-address-encoding-in-java](http://stackoverflow.com/questions/724043/http-url-address-encoding-in-java) – asgs 2011-06-08 20:00:11

+0

@asgs那么这比我之前使用的要好得多。感谢您的参考。 – ZKSteffel 2011-06-08 20:05:05

0

而不是直接编码字符串。编码url对象。这应该有助于防止MalformedURLException

try{ 
    URL url = new URL("http://myurl/otherparameters/here");  
    String encodedurl = URLEncoder.encode(url.toString(),"UTF-8");  
    } 
    catch(MalformedURLException mue) 
    { 
    System.err.println(mue); 
    } 
    catch(UnsupportedEncodingException uee) 
    { 
    System.err.println(uee); 
    } 
+1

虽然我不能使用字符串来打开连接,但不会将其更改回URL。我仍然得到了MalformedURLException,因为编码会编码正确定义URL所需的':'和'/'。 – ZKSteffel 2011-06-03 20:32:06