年明けから、いよいよJava EE 7で開発が始まりそうなので、冬休みを利用して色々準備したいなーと思ってます。
まずはテスト周辺を整備、と思って久しぶりにArquillianを触ってたのですが、いきなりハマってしまった(^^;
GlassFish 4系でのArquillian設定は以下サイトがバッチリでした。日本語ありがたや!
GlassFish 4でArquillianうごかす - kagamihogeの日記
で、上記サイトと同じようにPOJOなクラスを試すと無事動き、環境OKと。
しかし、簡単なJSF+CDIのサンプル作って試してた所…あれっ、動かない!
管理Beanは次のように超簡易なもの。
@Named(value = "sumBean")
@ViewScoped
public class SumBean implements Serializable{
public int sum(int x, int y){
return x + y;
}
}
faceletsはなくても…だけど一応。
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>足し算</title>
</h:head>
<h:body>
<h:outputText value="#{sumBean.sum(1, 1)}" />
<h:outputText value="#{sumBean.sum(2, 2)}" />
<h:outputText value="#{sumBean.sum(3, 3)}" />
<h:outputText value="#{sumBean.sum(4, 4)}" />
<h:outputText value="#{sumBean.sum(5, 5)}" />
</h:body>
</html>
で、テストコードはこんな形。
@RunWith(Arquillian.class)
public class SumBeanTest {
@Deployment
public static JavaArchive createDeployment(){
return ShrinkWrap.create(JavaArchive.class)
.addClass(SumBean.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Inject
SumBean mySum;
@Test
public void sumTest() {
assertThat(mySum.sum(1, 1), is(2));
assertThat(mySum.sum(2, 2), is(4));
assertThat(mySum.sum(3, 3), is(6));
assertThat(mySum.sum(4, 4), is(8));
assertThat(mySum.sum(5, 5), is(10));
}
}
エラーはWELD-001303なるもので、次のようなメッセージが。
WELD-001303: No active contexts for scope type javax.faces.view.ViewScoped
org.jboss.weld.context.ContextNotActiveException
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:687)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78)
at sample.jsfwitharquillian.SumBean$Proxy$_$$_WeldClientProxy.sum(Unknown Source)
at sample.jsfwitharquillian.SumBeanTest.sumTest(SumBeanTest.java:38)
ぐぐるとWildFlyだけど、次のが一番近い感じ。
Unable to test EE 7 ViewScoped beans like we us... | JBoss Developer
しかし不思議なのは、@ViewScopedを@RequestScopedや@SessionScopedに変えてみると動くこと。
なんでViewScopedだけ駄目なん…(^^;;;うーむ謎だ。
一応コード置いておこ…
kikutaro/JsfWithArquillian · GitHub
追記
後日、@nekopさんに教えて頂きました。Arquillian Warpを使うとできるようです!
早速@emaggameさんが試されていました!
Warpは触ったことなかったので、私も近々やってみようと思います。