2016-11-11 7 views
3

私は中規模のXtextプロジェクトのユニットテストを開始しようとしています。Xtextテストで生産性環境とは異なるオブジェクト注入を使用するにはどうすればよいですか?

現在、ジェネレータは、テスト中に模擬したい外部リソースに依存しています。したがって、必要なオブジェクトを@Inject経由でGeneratorクラスに注入します。

例えば擬似コードで:

class MyGenerator implements IGenerator{ 

@Inject 
ExternalResourceInterface resourceInterface; 

... 

} 

私は、言語のRuntimeModule内のバインディング、実際に作成します。

class MyRuntimeModule{ 
... 
    @Override 
    public void configure(Binder binder) { 
     super.configure(binder); 

     binder.bind(ExternalResourceInterface .class).to(ExternalResourceProductionAcess.class); 
    } 
... 
} 

これは、本番環境のために正常に動作します。 CompilationTestHelperに次の呼び出しはモック使用するように

しかし、発電機のテストケースでは、私は、私の嘲笑バージョンとの結合を交換したいと思います:

compiler.assertCompilesTo(dsl, expectedJava); 

質問:

私はguice/Xtextにインジェクションをモックにバインドするように教えますか?

答えて

4

RunWithとInjectWithでテストケースに注釈を付けると、テストクラスは特定のIInjectorProvider実装を介して注入されます。

インジェクタプロバイダがカスタムモジュールを使用している場合は、テストケースがそのコンフィグレーションを使用して注入されます。ただし、このインジェクタをテストコード全体で使用するようにする必要があります(登録されたインジェクタなどに依存しないなど)。一例として、次のコードのための

ルックは、(それをコンパイルしていないが、これはあなたが従わなければならない基本構造である):答えのための

@RunWith(typeof(XtextRunner)) 
@InjectWith(typeof(LanguageInjectorProvider)) 
public class TestClass { 

@Inject 
CompilationTestHelper compiler 

... 
} 
+0

感謝。生成されたInjectorProviderを使用すると、私のカスタムモジュールがロードされます。しかし、InjectorProviderがバインディングにMyRuntimeModuleを使用するとき、ExternalResourceProductionAccessがロードされ、私のモックはロードされないためです。カスタムInjectorProviderを記述しようとすると、XTextは注入されたリソースをロードしません。 – lwi

+0

数年前、VIATRAのXtextジェネレータで生成されたInjectorProviderをカスタマイズしました。たぶんあなたはそれを見ることができます:http://git.eclipse.org/c/viatra/org.eclipse.viatra.git/tree/query/tests/org.eclipse.viatra.query.patternlanguage.emf.tests /src/org/eclipse/viatra/query/patternlanguage/emf/tests/EMFPatternLanguageInjectorProvider.java –

関連する問題