2014-10-04 67 views
1

我知道有些開發人員說,它不是調用請求Web資源的EJB方法的單元測試。但是,請不要在此線索中爭論!我認爲這是值得的。如何測試調用REST調用的EJB服務類?

我的測試:TestNG的類 - > EJB方法 - >其他資源

設置:

  • Wildfly 8.1
  • TestNG的6.8.8
  • 的jboss-JAXRS-api_1.1_spec ,1.0.1.Final

這是我的測試班。

import org.testng.Assert; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

import com.doe.webapp.model.general.geoinfo.GeoInfo; 

public class GeoIPBeanTest { 

    @DataProvider(name = "ipAdresses") 
    public static Object[][] primeNumbers() { 
     return new Object[][] { 
       { "127.0.0.1", true }, // localhost 
       { "80.218.114.61", true } }; // real IP 
    } 

    @Test(dataProvider = "ipAdresses") 
    public void getGeoInfoByIp(String ipAddress, boolean isExpectedTrue) { 
     GeoIPBean geoIpBean = new GeoIPBean(); 
     GeoInfo geoInfo = null; 
     try { 
      geoInfo = geoIpBean.getGeoInfoByIp(ipAddress); 
     } catch (Exception ex) { 
      Assert.fail(ex.getLocalizedMessage()); 
     } 
    } 
} 

這是我的課程。

import javax.ejb.Singleton; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Invocation.Builder; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.MediaType; 

import com.doe.webapp.model.general.geoinfo.GeoInfo; 

@Singleton 
public class GeoIPBean { 

private static final String IPV4_PATTERN = "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; 

Map<String, GeoInfo> geoInfoCache = new HashMap<String, GeoInfo>(); 
// Service Description is here http://freegeoip.net/ 
static final String GEO_SERICE_URL = "http://freegeoip.net/"; 
static final String FORMAT = "json"; 

public GeoInfo getGeoInfoByIp(String ipAddress) { 
    if(!isValidIp(ipAddress)){ 
     //TODO log invalid IP as warning 
     return null; 
    } 

    GeoInfo geoInfo = geoInfoCache.get(ipAddress); 
    if (geoInfo == null) { 

     Client client = ClientBuilder.newClient(); 
     // Invoke the service. 
     WebTarget webTarget = client.target(GEO_SERICE_URL + FORMAT + "/" 
       + ipAddress); 
     //geoInfo 
     Builder builder = webTarget.request(MediaType.APPLICATION_JSON); 
     geoInfo = builder.get(GeoInfo.class); 
    } 
    return geoInfo; 
} 

public static boolean isValidIp(String ipAddress) { 
    if(ipAddress == null) 
     return false; 
    Pattern pattern = Pattern.compile(IPV4_PATTERN); 
    Matcher matcher = pattern.matcher(ipAddress); 
    return matcher.matches(); 
} 
} 

這個EJB在我的容器中運行時工作。它不適用於testNG的情況。

Client client = ClientBuilder.newClient(); 

這條線在EJB中返回錯誤。

java.lang.AssertionError: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder 
    at org.testng.Assert.fail(Assert.java:94) 
    at com.doe.webapp.service.general.geoinfo.GeoIPBeanTest.getGeoInfoByIp(GeoIPBeanTest.java:25) 

我開始還以爲是因爲我已經標註了提供範圍wildfly庫...

<!-- JBOSS JAX REST 2.0 FRAMEWORK --> 
    <dependency> 
     <groupId>org.jboss.spec.javax.ws.rs</groupId> 
     <artifactId>jboss-jaxrs-api_1.1_spec</artifactId> 
     <version>1.0.1.Final</version> 
    </dependency> 
    <!-- RS client library --> 
    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

...但Wildfly使用RestEasy的,而不是球衣。然後我加...

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.18.1</version> 
</dependency> 

...但沒有幫助。

回答

0

Wildfly,他們已經使用RESTEasy作爲默認的休息提供者。它states

的RESTEasy捆綁與JBoss/Wildfly和完全集成按Java EE 6

的要求,因此,你必須刪除您使用JerseyJboss/WildflyRESTEasy依賴defore。儘管我沒有這樣做,但可以有許多指導來做到這一點的資源。 (Checktheselinks。)

否則,作爲替代,你可以使用RESTEasy而不是Jersey