2016-12-02 4 views
0

mixinのテストを、Playアプリケーションとは別のスレッドで実行されるPlayアプリケーションに書き込む際に問題があります。私は幸運なしでWithApplication.provideApplicationメソッドを上書きしようとしました。 inheriting conflicting methodsエラーが発生します。 (実際のアプリ「MyRunnableSystemWrapper」の1つ、私ののうちの1つは、「MyMockedSystemWrapper」と呼ばれるの偽のミックスインです)。カスタム特性を拡張するPlayアプリケーションをテストする方法

execute(system)私のシステムは、他の場所でテストされ、サイドファクト(ネットワーク接続されたサービスに接続しているため、このようなものが利用できないときには失敗します)を実行します。 。。

class Application extends Controller with MyRunnableSystemWrapper { 

    val pool: ExecutorService = Executors.newFixedThreadPool(1) 
    val system = new MyRunnableSystem() //system is abstract in MRSW ^^^ above 
    pool.execute(system) 

    def index = Action { 
    OK("HI") 
    } 
} 

マイ:側が影響し、DB /ネットワーク呼び出しはしかし、私は「WithApplication」テストに私のアプリのTHIS嘲笑バージョンを与える方法がわからないうち嘲笑

明確にするためのコードを削減している必要はありませ試験:

class MyAppTest(implicit ee: ExecutionEnv) extends Specification { 

    abstract class WithMyMockApp extends WithApplication { 
    def provideApplication = new controllers.Application with MyMockedSystemWrapper // This imports MyRunnableSystemWrapper 

    } 

    "Sending a GET request" should { 
    "Respond with OK" in new WithMyMockApp { 
     val response = route(app, FakeRequest(GET, "/")).get 
     status(response) mustEqual OK 
    } 
    } 
} 

Runnableを正しい場所で実行しておらず、このテストを容易にするために別の場所に呼び出す必要がある場合は、教えてください。

+0

また、私のシステムの自己型リファレンスを作成することを考えました: 'class Application extends controller {mysys:MySystem => ...}'しかし、私はPlayに特定の依存関係。演奏は自動的にこのアプリケーションコントローラを見つけ出して起動しますので、どのようにミックスインをプロとテストに入れますか? – dlite922

+0

PlayはMySystemで起動する方法がわからないので、 'com.google.inject.ProvisionException:Unable to provision'エラーが発生します。 – dlite922

答えて

0

あなたはそれ

trait SystemWrapper { 
    def execute(system: RunnableSystem) 
} 

class MyRunnableSystemWrapper extends SystemWrapper {...} 
class MyMockedSystemWrapper extends SystemWrapper {...} 

class Application @Inject() (systemWrapper SystemWrapper) extends Controller { 

は、その後、あなたが実行し、テストのためのどちらに必要SystemWrapperのどの実装のGuiceに指示する必要があります拡張するのではなく、あなたのシステムのラッパーを注入できます。これを行う1つの方法は、.confファイルに設定した実行時/テスト用に異なるGuiceモジュールを使用することです。

+0

これは私が探しているものだと思うが、あなたは.confで私を失ってしまった。 .confの例がありますか?私はすでにtest.confをセットアップしており、テスト中に使用しています。ありがとう! – dlite922

+0

ここでモジュールを作成する方法と各 '.conf'ファイルにロードするモジュールを選択するhttps://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Play-libraries – Simon

+0

私は'私がインジェクション方法を試したときにcom.echostar.sse.meteor.models.Meteor.SystemComponentの実装がバインドされていませんでした。 'class prodSystem extends MeteorSystemComponent {rmqServiceFactory:RMQServiceFactory => val System = new MeteorSystem ) } class Application @Inject()(msc:Meteor.SystemComponent)は、ロギングを使用してコントローラを拡張します。{ ここではprodSystemという名前を付けました。エラーメッセージによれば、それは拘束力がありません。どのように私は2つをバインドするのですか? – dlite922

関連する問題