2011-07-13 10 views
1

はここに私のコード例Groovy内の別のオブジェクトの内部でインスタンス化されたオブジェクトをモックする方法はありますか?

class CommandLine { 

    def ls() { 
     def cmd = "ls".execute() 
     if(cmd.waitFor() != 0) { 
      throw new Execution() 
     } 
     return cmd.text 
    } 
} 

cmd変数は型のjava.lang.Processのオブジェクトを保持しているのです。スローされた例外をテストするには、waitFor()メソッドをどうやって模擬しますか?私ができない場合、自動テストを容易にするためにこれを書き換えることができる方法はありますか?

一般に、別のクラスの中でインスタンス化されたオブジェクトをモックするにはどうすればよいでしょうか、あるいはテストのためにコードをどのように構造化しますか?

+0

一般的な手法は、 'execute'関数をモックアップして、正規のものではなく'模擬した 'java.lang.Process'を返すことです。 – bezmax

答えて

0

回答は、組み込みのGrailsモックの代わりにGroovyモックを使用することです。

import groovy.mock.interceptor.MockFor 

class TestClass { 

    def test() { 
     def mock = new MockFor(classToBeMocked) 

     mock.demand.methodToBeMocked(1..1) { -> /* code */ } 

     mock.use { 
      /* 
      All calls to objects of type classToBeMocked will be 
      intercepted within this block of code. 
      */ 
     } 
    } 
} 
1

私はGroovyのに慣れていないんだけど、ゼロでない結果を返すメソッドwaitFor()と嘲笑Processを返すようにする方法String#execute()をあざけるのチャンスがあります場合には、次のようにそれを

何かをする方法だろう:

Process mockedProcess = MockingFramework.mock(Process.class); // MockingFramework can be Mockito 
MockingFramework.when(String.execute()).thenReturn(mockedProcess); 
MockingFramework.when(mockedProcess.waitFor).thenReturn(1); 

new CommandLine().ls(); // Boom! => Execution exception 
関連する問題