2015-12-21 3 views
0

Я использую Mockito в своих тестах JUnit. Тест является интеграционным тестом, проверяющим весь сценарий, поэтому в нем много утверждений и verify(mock).mockito «проверяет» проверяет текущее состояние, но не возвращает макетные вызовы

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

interface I { 
    void m1(); 
    void m2(); 
} 

// some decorator 
class T implements I { 
    public T(I decorated) { 
     /*...*/ 
    } 

    /* ... */ 
} 

public void testInvalid() { 
    I m = mock(I.class); 
    T t = new T(m); 

    t.m1(); 
    assertEquals("m1", t.getLastMethod()); 
    verify(m).m1(); 

    t.m2(); 
    assertEquals("m2", t.getLastMethod()); 
    verify(m).m2(); 

    t.m1(); 
    assertEquals("m1", t.getLastMethod()); 
    verify(m).m1(); 

    // TooManyActualInvocations t.m1(): Wanted 1 time, but was 2 times ... 
} 

public void testValid() { 
    I m = mock(I.class); 
    T t = new T(m); 

    t.m1(); 
    assertEquals("m1", t.getLastMethod()); 

    t.m2(); 
    assertEquals("m2", t.getLastMethod()); 

    t.m1(); 
    assertEquals("m1", t.getLastMethod()); 

    verify(m, times(2)).m1(); 
    verify(m).m2(); 
} 

Одна идеи заключается в том, чтобы проверить издевается в конце, но, скажем, есть маленькая глупая ошибка реализации, что приводит к вызову метода m1 дважды м2 один раз, но не так как я бы ожидать это в testInvalid, но в конце тест пройдет. Я хочу, чтобы мой тест провалился раньше. Как это сделать?

спасибо.

Благодаря @Woozy Coder:

Не упоминается, что reset также будет вариант, но так как она будет называться между проверки и на следующий вызов равен заглушкой, это делает его трудно писать " хороший "и правильные тесты, я думаю. Там должно быть два разных стилей насмешливо:

  1. «Постусловие» насмешливый, как Mockito делает это
  2. «рано» пересмешник, который будет неявный сброс после блока проверки-

что-то вроде:

earlyReset(m).after(
    new Runnable() { 
     t.someMethodInvokingTwoStubs(); 

     verify(m).someMethod1(); 
     verify(m).someMethod2(); 
    } 
); 
+1

Дайте попробовать на этот [ответ] (http://programmers.stackexchange.com/questions/188299/is-this-an-appropriate-use-of-mockitos-reset-method) – kazbeel

+0

Не испытывай несколько методов в одном методе тестирования. Тест должен иметь ОДНУ вещь, которую он тестирует, и предпочтительно ОДНУ вещь, которая может потерпеть неудачу. Тестирование нескольких методов делает ваш тест более сложным. Разделение ваших тестов на несколько методов тестирования решит эту проблему. –

+0

@WoozyCoder спасибо, отредактировал мой пост – Aitch

ответ

0

Mockito был написан во избежание хрупкости, так что проверка может сделать наименее конкретное утверждение возможным, чтобы реализации могли развиваться без chan Испытание. Если ваша тестовая система не имеет значения, что вы вызываете эти методы несколько раз, тогда вы не должны просить Mockito проверить ее.

Альтернативы:

  • Использование atLeast или atLeastOnce для обеспечения вызова произошло совсем не волнуясь, как называется многие дополнительные раз метод.
  • Если вызов укушен, чтобы иметь возвращаемые значения, сделайте вывод, что система работает с утверждениями состояния о данных, которые вы зарезали.
  • Если вам действительно нужно поведение заглушки или проверки для изменения по одному методу тестирования, ваш макет может выйти за рамки того, что делает Mockito. Используйте ответ для одного метода или напишите руководство Fake, которое правильно имитирует взаимосвязанные методы.
+0

Я думал о внедрении билетной машины с моим автоматом. Он запускается в IdleState, который должен вызывать 'onIdle', затем мы выбираем билет, платим его, и он должен вернуться в IdleState и снова вызвать' onIdle'. Это тихий комплексный тест, но он является основой для реализации государственного аппарата, а также документации по функциональности. В начале я ожидаю, что onIdle будет вызван и, наконец, после того, как билет будет оплачен. 'atLeast (2)' в конце слишком расплывчато для меня. Я думаю, что Mockito не подходит для таких интеграционных тестов, но мне очень нравится Mockito, потому что он прост в использовании – Aitch

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