2015-03-30 2 views
1

Я новичок в mockito. Провел больше дня, пытаясь понять, как это работает. Это мое последнее средство.Локальный метод не обновляет переменные экземпляра моего издевающегося класса

У меня есть класс следующим образом:

class Check{ 
    //Map<String, Long> map1 = new HashMap<String, Long>(); 
    //Map<String, Long> map2 = new HashMap<String, Long>(); 

boolean myLocalMethod(String key, Map<String, Long> map1){ 
    if(map1.get(key) == null){ 
    map1.put("name", (long)10); 
    return false; 
    } 
    else if(map1.get(key) == 10) 
      return true; 
     else 
      return false; 
} 

У меня есть тестовый класс следующим образом:

class TestCheck(){ 
Check mockTest = mock(Check.class); 

@Test // using testng. That's what I like 
public void testMyLocalMethod(){ 
    Map<String, Long> map1 = new HashMap<String, Long>(); 
    Assert.assertFalse(mockTest.myLocalMethod("name", map1)); 
    map1.put("name", (long)10); 
    Assert.assertTrue(mockTest.myLocalMethod("name", map1)); // fails 

Это будет здорово, если кто-то может дать мне некоторые указания здесь. Заранее спасибо!

+1

Mockito не использует вашу реализацию, просто ваш интерфейс. Вы не должны ожидать, что он обновит любые переменные. Если вы действительно хотите использовать свою реализацию 'Check', просто создайте его как обычно. –

+0

О, ладно. Итак, выполнив тест, map1.put («name», 10) не будет обновляться, если я использую mock (Check.class)? –

+1

Исправить. См. Мой ответ ниже для некоторого примера кода того, как вы можете думать о том, как реализуется макет. –

ответ

0

Когда вы просите Мокито издеваться над классом, он отменяет вашу существующую реализацию. Внутри она определяет новый класс, который на базовый уровне будет выглядеть примерно так, если вы сделали это явно и не добавляйте какое-либо дополнительное поведения, используя when или аналогичный:

class MockCheck extends Check { 
    @Override 
    void myLocalMethod(String key) {} 
} 

т.е. вызов myLocalMethod не фактически вызывать версию родительского класса myLocalMethod.

Если вы хотите использовать реализацию Check, просто создать его экземпляр как обычный объект:

Check mockTest = new Check(); 
+0

Энди, спасибо за помощь до сих пор! Теперь я понимаю, что лучше подражать. Я не хочу использовать оригинальный класс, поскольку он имеет некоторые накладные расходы на конфигурацию, и именно поэтому я пытаюсь его издеваться. Я изменил код, и вы знаете, почему Assert.assertTrue терпит неудачу с изменением, которое я сделал? –

+0

Я удивлен, что он даже компилируется. 'myLocalMethod' имеет тип' void', поэтому вы не можете использовать его в качестве параметра для вызова другого метода. –

+0

'map1.put (" name ", 10);' также не будет компилироваться. Должно быть '10L'. –

0

Как уже упоминалось другие, фиктивный объект не будет использовать фактическую реализацию. Но вы можете использовать объект Spy для проверки поведения, используя фактическую реализацию, см. Spying on real objects

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