Как я могу издеваться над пустым методом и оставить все остальное таким же, используя мокито? - PullRequest
3 голосов
/ 11 февраля 2012

Я использую 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 

}

Спасибо, - Дейв

Ответы [ 3 ]

3 голосов
/ 11 февраля 2012

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

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

1 голос
/ 11 февраля 2012

Поместите вызов в ваш кеш в метод 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 голосов
/ 11 февраля 2012

Конечно, это не работает: в setupMockCache вы создаете макет кеша CacheService cs = mock(CacheService.class);, в котором вы определяете заглушку. Но экземпляр cs никогда не пропускается. И в initCache вы вызываете метод установки, но вы не получаете экземпляр CacheService, сразу после того, как вы написали это утверждение CacheService.getInstance().startCache();, которое, безусловно, создаст настоящий экземпляр CacheService, и, конечно, оно не будет используйте оскверненный экземпляр.

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

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

...