如何测试调用REST调用的EJB服务类?

时间:2014-10-04 14:00:23

标签: json jersey testng resteasy wildfly-8

我知道有些开发人员说它不是一个单元测试来调用请求Web资源的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而不是Jersey。然后我加了......

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

......但两者都没有帮助。

1 个答案:

答案 0 :(得分:0)

Wildfly中,他们一直使用RESTEasy作为默认的休息提供者。它states

  

RESTEasy与JBoss / Wildfly捆绑在一起,并根据Java EE 6的要求完全集成。

因此,在RESTEasy使用Jersey之前,您必须删除Jboss/Wildfly依赖项。尽管我还没有这样做,但可以有很多资源来指导这样做。 (Check these links。)

或者,作为替代方案,您可以使用RESTEasy代替Jersey