Как протестировать сервисный класс EJB, который вызывает вызов REST?

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

мой тест: класс testng -> метод EJB -> ресурс отдыха

Настраивать:

  • Дикая муха 8.1
  • ТестНГ 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, а не Jersey. Потом добавил...

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

... но тоже НЕ помогло.


person feder    schedule 04.10.2014    source источник


Ответы (1)


В Wildfly они использовали RESTEasy в качестве провайдера отдыха по умолчанию. В нем указывается,

RESTEasy связан с JBoss/Wildfly и полностью интегрирован в соответствии с требованиями Java EE 6.

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

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

person Maleen Abewardana    schedule 10.10.2014