2014-10-18 3 views
0

У меня есть функция, подобная следующей.Как найти количество статических функций называется Mockito

public String getDecodedToken() throws UnsupportedEncodingException { 
    if (token == null) { 
     String token = ClassContainingStatic 
       .findString("static"); 
     this.token = new String(Base64.decodeBase64(token), "UTF-8"); 
    } 
    return token; 
} 

Чтобы проверить функцию, я не хочу, чтобы дразнить ClassContainingStatic класс, потому что это сделает тест бесполезно. Скорее я хотел бы видеть, что если вызов произошел с ClassContainingStatic.findString ("static") без издевательства над объектом. Есть ли способ достичь числа вызовов функций, сделанных для реального объекта?

+0

Возможно, вы должны издеваться над своим классом с помощью 'doCallRealMethod'? –

ответ

1

Возможно, возможно с небольшим количеством рефакторинга. Если извлечь вызов статического класса в отдельный метод:

public String getDecodedToken() throws UnsupportedEncodingException{ 
    if(token == null){ 
    token = createToken(); 
    } 
    return token; 
} 

String createToken() throws UnsupportedEncodingException{ 
    String token = ClassContainingStatic.findString("static"); 
    return new String(Base64.decodeBase64(token), "UTF-8"); 
} 

Теперь вы можете создать макет или шпион, а просто проверить, является ли называется методом.

ClassUnderTest spy = Mockito.spy(new ClassUnderTest()); 
String token = spy.getDecodedToken(); 
Mockito.verify(spy).createToken(); 

Я предположил, что строка "static" исправлена. Если нет, передайте его как параметр в класс createToken, а затем вы можете отрегулировать verify соответственно.

Возможно, я допустил ошибку в синтаксисе Mockito, но общая идея должна быть ясной. Единственным недостатком является то, что вам нужно создать пакет видимый/защищенный (или даже общедоступный, если хотите, но, как правило, это не так) метод, чтобы можно было позвонить verify.

+0

Это может превзойти цель тестирования, как в будущем, если кто-то изменит вызов класса ClassContainingStatic.findString («статический») 'на' SomeOtherClassContainingStatic.findString («static») ', тест все равно будет успешным. –

+0

Также потому, что я очень новичок в тестировании модулей, следовательно, другой вопрос. Должны ли мы издеваться над тестируемым классом. Обычно я видел, как люди обычно объявляют приватную переменную (например, 'private ClassUnderTest classUnderTest'), а затем в' setUp() 'они будут делать classUnderTest = новый ClassUnderTest'. Какова будет разность потенциалов между двумя –

+0

@AmanDeepGautam для новых вопросов, ну, пожалуйста, задайте новый вопрос. –

1

Основная вещь, в которой вы нуждаетесь, называется шпионом на языке Mockito.

В то время как макет - это совершенно новый объект, шпион обертывает существующий экземпляр и пересылает его методы к исходному объекту по умолчанию и в то же время поддерживает насмешку вызовов методов или проверку вызовов.

Но у вас есть еще одна проблема: метод, который вы хотите проверить, кажется статическим. С Mockito вы не можете издеваться над статическими методами. У вас два основных варианта:

  1. Refactor так, что метод больше не статичен и вы обеспечиваете объект, который хозяйничает метод в качестве параметра конструктора. Этот параметр может быть макетом или шпионом.

  2. Используйте PowerMock для издевательства статических методов. Я бы согласился с использованием PowerMock в старых проектах, где нужно создавать тесты с минимальным количеством рефакторингов. PowerMock проницательный, но неуклюжий, медленный и склонный к возникновению проблем в будущем, например. путем создания множества классов «на лету», что приводит к проблемам PermGen.

Смежные вопросы