読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

ArquillianでViewScopedのCDI管理BeanだけInjectできない

Arquillian GlassFish JUnit

年明けから、いよいよ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' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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)

  • 略 -

f:id:kikutaro777:20141231010527j:plain

ぐぐるとWildFlyだけど、次のが一番近い感じ。

Unable to test EE 7 ViewScoped beans like we us... | JBoss Developer

しかし不思議なのは、@ViewScopedを@RequestScopedや@SessionScopedに変えてみると動くこと。

f:id:kikutaro777:20141231010533j:plain

なんでViewScopedだけ駄目なん…(^^;;;うーむ謎だ。

一応コード置いておこ…

kikutaro/JsfWithArquillian · GitHub

追記
後日、@nekopさんに教えて頂きました。Arquillian Warpを使うとできるようです!

早速@emaggameさんが試されていました!

Warpは触ったことなかったので、私も近々やってみようと思います。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村