2014-01-17 13 views
7

Spockの魅力を広げようとしています。実際にはGroovyクラスの単体テストを作成しようとしましたが、Javaに呼び出すユニットテストを作成しようとしました。静的メソッドはプライベートコンストラクタを呼び出します。コードは次のようになります。SpockモックでJavaコンストラクタを使うことができます

private MyConfigurator(String zkConnectionString){ 
    solrZkClient = new SolrZkClient(zkConnectionString, 30000, 30000, 
      new OnReconnect() { 
       @Override 
       public void command() { . . . } 
      }); 
} 

"SolrZkClient"はサードパーティ(Apache)Javaライブラリからのものです。 ZooKeeperに接続しようとしているので、ユニットテストの一環として内部テストを実行するのではなく、このユニットテストを模擬したいと思います。

私のテストは問題なくコンストラクタに取得しますが、私はそのCTORを乗り越えることはできません。

def 'my test'() { 
    when: 
     MyConfigurator.staticMethodName('hostName:2181') 
    then: 
     // assertions 
} 

これを行うには、とにかくはありますか?

答えて

8

テスト対象のクラスはGroovyで書かれているので、グローバルGroovy Mock/Stub/Spy(Spock Reference DocumentationMocking Constructorsを参照)を使ってコンストラクタ呼び出しをモックできなければなりません。しかし、より良い解決策は、より多くのテスト可能にするために、MyConfiguratorクラスの実装を切り離すことです。たとえば、SolrZkClientのインスタンス(またはベースインターフェイスがある場合はそのインスタンス)を渡すことができる2番目のコンストラクタや静的メソッドを追加できます。それで簡単に偽物を渡すことができます。

+0

感謝のピーターは、非常に '常識'のアドバイスのようです。この答えを実践に移すことを遅らせることは問題であった。少量のコードでも調べるのはなぜかを示しています。このクラスの目的は、SolrCloud設定の根底にある詳細を隠す抽象クラスにすることです。それらの詳細を抽象化するために、必要なのはconnectStringだけです。したがって、クラスが隠そうとしているオブジェクトを渡すことは、実際の選択肢ではありません。今日これ以上の時間を費やして、私は再びコメントします。 – JoeG

+0

2番目のコンストラクタを追加できないのはなぜですか? –

+0

それはカプセル化を壊すでしょう - クラスの目的の1つは、SolrZkClientの構造を隠すことです。 – JoeG

関連する問題