arquillian-managed
今回で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 を参考にすれば良いんですが
公式的にはcatalinaHomeなプロパティしか明記されてないけど、その実体となるTomcatManagedContainerのソース見ると「new File(CATALINA_BASE).getAbsolutePath()」みたいなのがある。これがNPE吐いてる
— kinjouj (@kinjou_j) 2014, 9月 15
でこのCATALINA_BASEっていうのがTomcatManagedConiguration.getCatalinaBaseからやってくるので、arquillian.xmlに両方を設定すりゃ良い
— kinjouj (@kinjou_j) 2014, 9月 15
っていう事なので
<?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パッケージを使えば可能ってな事