arquillian-managed

2014-09-15T00:00:00+00:00 Java JAX-RS

今回で3回のarquillianネタとして、今までをまとめると

  • arquillian-embeddedで組み込みのサーバーを使ってテスト
  • arquillian-remoteで外部のサーバーを利用してテスト

っていう感じなのでだけど、ローカルにあるサーバーとかを使ってテスト出来る仕組み的なのがarquillian-managedに相当するのではないかと。という事でやってみた

その前に

glassfishなarquillian-managedがどうも実体がglassfish4な場合だと動作してくれないのでTomcat(tomee-jaxrs)を使ってテストする

tomcat側の設定

ユーザー設定をしておく必要がある(デプロイを利用する為にmanaged-scriptを使う為に必要かと)

<?xml version="1.0" encoding="utf-8"?>
<tomcat-users>
    <user username="hoge" password="hoge" roles="manager-script" />
</tomcat-users>

んまぁユーザー名とかは適当に。これはarquillian.xmlでも指定するので(ry

build.gradle

apply plugin: "java"
apply plugin: "war"
apply plugin: "eclipse"

repositories {
    mavenCentral()
}

dependencies {
    compile "javax:javaee-api:7.0"

    testCompile "junit:junit:+"
    testCompile "org.hamcrest:hamcrest-all:+"
    testCompile "org.jboss.arquillian.junit:arquillian-junit-container:+"
    testRuntime "org.glassfish.jersey.core:jersey-client:2.+"

    providedRuntime "org.jboss.arquillian.container:arquillian-tomcat-managed-7:+"
}

JAX-RSアプリケーション側の設定

jersey実装が使えないはずなので

package sample;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/resources")
public class SampleApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(Greeter.class);
        classes.add(Hoge.class);
        classes.add(IndexController.class);

        return classes;
    }
}

な感じでResourceConfigではなく、javax.ws.rs.core.Applicationを使う

でこの時点でwar化してTomcatにデプロイして動くか確認

SampleTest.java

package sample;

import java.io.File;
import java.net.URL;

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@RunWith(Arquillian.class)
public class SampleTest {

    @ArquillianResource
    URL deploymentUrl;

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive a = ShrinkWrap.create(WebArchive.class, "test.war")
            .addPackage("sample")
            .addAsWebInfResource(new File("src/main/webapp/WEB-INF/beans.xml"))
            .addAsWebInfResource(new File("src/main/webapp/WEB-INF/web.xml"));

        return a;
    }

    @RunAsClient
    @Test
    public void test_greeter() throws Exception {
        String response = target(deploymentUrl.toString() + "resources/sample/greet")
            .request()
            .get(String.class);

        assertThat(response, is("fuga"));
    }

    private WebTarget target(String uri) {
        return ClientBuilder.newClient().target(uri);
    }
}

arquillian.xml

https://docs.jboss.org/author/display/ARQ/Tomcat+7.0+-+Managed を参考にすれば良いんですが

っていう事なので

<?xml version="1.0" encoding="UTF-8" ?>
<arquillian
    xmlns="http://jboss.org/schema/arquillian"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">

    <container qualifier="tomcat-managed" default="true">
        <configuration>
            <property name="catalinaHome">/opt/tomee</property>
            <property name="catalinaBase">/opt/tomee</property>
            <property name="bindHttpPort">8080</property>
            <property name="user">hoge</property>
            <property name="pass">hoge</property>
        </configuration>
    </container>
</arquillian>

ってな感じの設定をしておく必要がある。ちなみにCATALINA_HOME/CATALINA_BASEの環境変数をロードするのでそれを設定しても構わない

あとは普通にテストを実行すればTomcatにデプロイしつつのArquillianテストを実行出来るっていう感じで

ってな感じでローカルにTomcat等のサーバーを起動してデプロイしてテストを実行するようなケースであればmanagedパッケージを使えば可能ってな事

HttpsURLConnection TrustManager arquillian-remote