2017-05-12 5 views
0

JSF 2.2アプリケーションでは、Seleniumでテストするためのwarファイルを作成したいと考えています。そのwebtest.warでは、NodeCacheと呼ばれる中央クラスを、WebtestNodeCacheというモックバージョンで置き換えて、データベースや他の外部依存関係をテストから守りたいと考えています。テストのためのServletContextリスナーを含むJSF更新管理Bean

NodeCacheが管理Beanです:

@javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) 
@javax.faces.bean.ApplicationScoped 
public class NodeCache { 
    public static final String INSTANE = "nodecache"; 
    // ... 
} 

WebtestNodeCacheにこっそり、私はこのようなのServletContextListenerを使用します。通常で

public class WebtestContextListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     WebtestNodeCache nodeCache = new WebtestNodeCache(); 
     ServletContext context = event.getServletContext(); 
     context.setAttribute(NodeCache.INSTANCE, nodeCache); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
} 

ビルド、WebtestContextListenerとWebtestNodeCacheは、warファイルから除外されていますテストビルドでは、それらが含まれています。

これはうまくいくようです。ログインすると、WebtestNodeCacheからダミーノードが取得されます。

これは、アプリケーションのコンテキストでBeanを置き換える信頼できる方法ですか、それとも私はただラッキーですか?

テストダミーに潜入するに​​は、より良い方法がありますか?

答えて

0

@ManagedBeanアノテーションとリスナーの両方を使用してオブジェクトを置き換えても機能しませんでした。コードは、常に、モックされていない実動コード管理されたBeanを使用していました。

同じ名前の新しい@ManagedBeanを定義するとエラーになり、展開が妨げられます。私はこれで終わった

  • 実際のBeanとそのモックの両方で同じ名前を持つ@ManagedBean注釈を入れてください。

  • ビルド時には、webtest.warをビルドするときにモックだけを組み込みますが、通常のビルドではビルドしないでください。

  • 構築する場合、生産コードで@ManagedBean宣言の後ろに特別なコメントを探して、生産上の@ManagedBean宣言を削除するには、これらの行を取り出し、ビルドスクリプト(私の場合のGradleが)ソースをコピーして、フィルタリング持っていますモック内のものだけが残るようにしてください。

だから、元NodeCacheは次のようになります。

@javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) // webtest:remove 
@javax.faces.bean.ApplicationScoped // webtest:remove 
public class NodeCache { 
    public static final String INSTANE = "nodecache"; 
    // ... 
} 

と嘲笑のバージョンはちょうどコメントせずに、同じ注釈があります。ここでは

@javax.faces.bean.ManagedBean(name = NodeCache.INSTANCE) 
@javax.faces.bean.ApplicationScoped 
public class WebtestNodeCache extends NodeCache { 
    // ... 
} 

はの関連する部分でありますGradleビルドスクリプト:

boolean isWebtest = false 
gradle.taskGraph.whenReady { taskGraph -> 
    isWebtest = taskGraph.hasTask(compileWebtestWarJava); 
} 

task copySrc(type: Copy) { 
    from "src" 
    into "${buildDir}/src" 
    outputs.upToDateWhen { 
     // Always execute this task so that resources do or don't get filtered 
     // when switching between normal war file and webtests. 
     false 
    } 
    filter { String line -> 
     isWebtest && line.contains("webtest:remove") ? null : line; 
    } 
} 

これは私の問題を解決します。他の誰かがそれが有用であることを願っています。

関連する問題