2012-02-10 12 views
3

私はMockitoを使用していて、うまく簡単なことをしたいと思います。どのように私は特定のクラスのvoidメソッドを模擬するのですか?私が試した...voidメソッドを模擬し、それ以外のものはすべてmockitoを使用してそのまま残すことができますか?

CacheService cs = mock(CacheService.class); 
    when(cs.startCache()).then(PopulateCache.addTestEntriesToCache()); 

しかし、私は

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile (default-testCompile) on project cme-productplus-web: Compilation failure: Compilation failure: 
[ERROR] \Documents and Settings\E18538\workspace\cme-productplus-web\src\test\java\com\cme\clearing\product\server\PopulateCacheServiceImpl.java:[32,65] 'void' type not allowed here 
[ERROR] \Documents and Settings\E18538\workspace\cme-productplus-web\src\test\java\com\cme\clearing\product\server\PopulateCacheServiceImpl.java:[32,20] 'void' type not allowed here 

私の意図はCacheService.startCacheの通常のコードを呼び出すのではなく、あるコンパイルエラーを取得しています、私は、私自身のメソッドを呼び出したいです」 PopulateCache.addTestEntriesToCache() "これどうやってするの?

編集:...与えられた応答パーが、私はモックを実装する私のクラスを編集しようとしたが、モックメソッド(doAnswerは、おそらく)と呼ばれる取得されていない

public class PopulateCacheServiceImpl extends RemoteServiceServlet implements PopulateCacheService { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public Boolean initCache() { 
    boolean ret = false; 
    try { 
     setupMockCache(); 
     CacheService.getInstance().startCache(); 
     ret = true; 
    } catch (Exception e) { 
     e.printStackTrace(System.err); 
     ret = false; 
    } // try 
    return ret; 
} // initCache 

private void setupMockCache() { 
    CacheService cs = mock(CacheService.class); 
    try { 
     doAnswer(new Answer<Object>() { 
      public Object answer(InvocationOnMock invocation) throws Throwable { 
       PopulateCache.addTestEntriesToCache(); 
       return null; 
      } 
     }).when(cs).startCache(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} // setupMockCache 

} 

感謝、 - デイブ

+1

可能性のある複製http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – Gray

+0

「ニャニャヤヤ、あなたは空法です!」 – yshavit

答えて

3

のanwser-方法であなたのキャッシュに電話を入れてCacheServiceのためのock、しかしあなたはまだそれを返してどこでもそれを使用していません。代わりに、実際の静的なCacheService.instance()メソッドを呼び出しています。このメソッドは、あなたのモックを返さないでしょう。 setupMockCache()はCacheServiceを返し、instance()メソッドを経由するのではなく、直接使用します。

また、タイトル/サマリーの質問では、「他のすべてを同じにしてください」と言っています。 CacheServiceの残りの部分が正常に動作するようにするには、mock()の代わりにMockitoのspy()を使用することができます。

1

あなたは午前を作っているこのhttp://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12

Mockito.doAnswer(new Answer<Object>() { 
     public Object answer(InvocationOnMock invocation) throws Throwable { 
      PopulateCache.addTestEntriesToCache() 
      return null; 
     } 
    }).when(cs).startCache(); 
+0

この回答をありがとうが、このコードでも、私が試しているモックしようとしているvoidメソッドは呼び出されていません。私は行方不明のものが他にありますか?私は上記の私のコードを含めた。 – Dave

0

もちろん動作しません。setupMockCacheでは、スタブを定義するキャッシュモックCacheService cs = mock(CacheService.class);を作成しています。しかし、csインスタンスは決して渡されません。 initCacheでは、CacheServiceインスタンスを取得していますが、実際にCacheServiceインスタンスを作成するこの文CacheService.getInstance().startCache();を作成した直後には、CacheServiceインスタンスは取得されません。もちろん、mockedインスタンスは使用されません。

私はあなたが何をしたいのか分かりませんが、これはあなたの生産コードにキャッシュを部分的に模倣するために奇妙で間違っているようです!私があなたの場合は、必要に応じて継承されたCacheServiceクラス(このクラスはstartCacheメソッドを明示的に上書きします)によってバックアップされたカスタムキャッシュを返す独自のクラスセットを作成します。

希望に役立ちます!

関連する問題