2017-07-17 5 views
0

私はgroovyでテストを書いています。共同作業者の共同作業者(CUT) )。groovy:共同作業者のゲッターを模擬してスタブを返す方法

project.loggerは、インターフェイスorg.gradle.api.Project.Loggerのインスタンスを返します。ロガーは私が嘲笑する必要があるゲッターです。

Loggerインターフェイスを実装せずにLoggerを作成し、それを返す方法はありますか? 私はテストを模擬することに全く新しいので何かが欠けていると思います。

おかげ 月

のTestCase:

import org.gradle.api.Project 

class MyClassUnderTestTestCase{ 
    @Test 
    void testDoSomething(){ 
     StubFor projectStub = new StubFor(Project) 
     projectStub.demand.getLogger { } // create a Logger stub here? 

     projectStub.use { 
      def project = { } as Project 
      MyClassUnderTest cut = new MyClassUnderTest(project) 
      cut.doSomething() 
      //Further assertions 
     } 
     projectStub.expect.verify() 
    } 
} 

マイCUT:

import org.gradle.api.Project 

class MyClassUnderTest{ 
    private Project project 

    MyClassUnderTest(Project project){ 
     this.project = project 
    } 

    void doSomething(){ 
     project.logger.info "Start doing something..." // project.logger should now return a stubbed instance of Logger 
     //Do some stuff 
    } 
} 

答えて

0

ほとんど!あなたはあまりにもロガースタブを使用する必要があります。

class MyClassUnderTestTestCase{ 
    @Test 
    void testDoSomething(){ 
     // Stubbing interface! 
     StubFor loggerStub = new StubFor(Logger) 
     loggerStub.demand.info { msg -> println "Mocked $msg" } 
     // Logger interface proxy 
     Logger loggerProxy = loggerStub.proxyInstance() 

     // Stubbing interface! 
     StubFor projectStub = new StubFor(Project) 
     projectStub.demand.getLogger { loggerProxy } 
     // Project proxy instance 
     Project projectProxy = projectStub.proxyInstance() 

     // Inject the proxy instance of Project 
     MyClassUnderTest cut = new MyClassUnderTest(projectProxy) 
     cut.doSomething() 

     // Verify the proxy interaction 
     projectStub.verify(projectProxy) 
    } 
} 

インターフェイスを使用している場合、あなたは()proxyInstanceを使用してインターフェイスの実装を取得する必要があります。

そして私はユニットテストのためのグルーヴィーな開発者のために1つの提案があります:この素晴らしいフレームワークを確認してください:spock framework

+0

私はstub.useクロージャをネストできるかどうかわかりませんでした。 しかし、私は今にNullPointerを取得しています: 'のjava.lang.NullPointerException:org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)でnullオブジェクト \tにメソッドの情報を()を呼び出すことはできません' –

+0

多分{}をProjectとして新しいProject()に変更したら?私はここでいくつかのテストを行いましたが、これはコードと私の唯一の違いです。 – rafaelim

+0

プロジェクトとロガーはインターフェイスなので、新しいプロジェクトをインスタンス化することはできません。 これらのインターフェイスが本当に重いので、これらのインターフェイスのダミー実装を提供するか、実装クラスを検索する必要がないという事実を利用したいと思います(両方のクラスを実装すると1000までの合計を実装します) –

関連する問題