2012-02-10 1 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()». Как я могу это сделать?

Edit: Per ответ данного, я пытался редактировать мой класс, где я реализую Мок, но издеваться метод (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

«Nya nya nya, вы недействительный метод!» – yshavit

ответ

3

Вы делаете утро ock для CacheService, но вы все равно не возвращаете его и не используете его нигде. Вместо этого вы вызываете реальный статический метод CacheService.instance(), который не возвращает ваш макет. Сделайте setupMockCache() верните CacheService и используйте его напрямую, а не пройдя через метод instance().

Также в заголовке вопроса/резюме вы сказали: «Оставьте все остальное одинаковым». Если вы имеете в виду, что вы хотите, чтобы остальная часть CacheService вела себя так же, как и нормальная, то, возможно, вам нужен частичный макет, который вы можете сделать с помощью шпиона Mockito() вместо mock().

1

Поместите вызов в кэш в anwser-методе этого 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.getInstance().startCache();, которое, безусловно, создаст реальный экземпляр CacheService, и, конечно, он не будет использовать посмеянный экземпляр.

Я не знаю, что вы хотите сделать, это кажется странным и неправильным, чтобы частично издеваться над кешем в вашем производственном коде! Если бы я был вами, я бы создал свой собственный набор классов, который, если необходимо, вернет ваш собственный кеш, поддерживаемый унаследованным классом CacheService (этот класс явно переопределит метод startCache).

Надеюсь, что это поможет!