2014-10-04 2 views
1

Я знаю, что некоторые разработчики говорят, что это не единичный тест для вызова метода EJB, который запрашивает веб-ресурс. Однако, пожалуйста, не спорьте об этом в этой теме! Я думаю, что стоит это сделать.Как проверить класс службы EJB, который вызывает вызов REST?

мой тест: 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.

Поэтому вы должны удалить RESTEasy зависимостей defore вы используете Jersey с Jboss/Wildfly. Хотя я этого не делал, может быть много ресурсов, которые помогут сделать это. (Checktheselinks.)

Или же, в качестве альтернативы, вы можете использовать RESTEasy вместо Jersey.

 Смежные вопросы

  • Нет связанных вопросов^_^