2016-11-16 16 views
0

Какая разница между andAnswer() и andDelegateTo() методами в EasyMock с точки зрения использования?EasyMock: andAnswer() vs andDelegateTo()

Первое отличие

Я знаю, что, когда используется andAnswer метод, он пропускается вызов конструктора. Это важно, если конструктор делает дополнительные вещи.

class Dummy { 
    public Dummy(Object someArgument) { 
     // some validations of arguments 
     System.out.println("the constructor is called"); 
    } 
    public Object method() { 
     System.out.println("the method is called"); 
     return new Object(); 
    } 
} 


@Test 
public void testSt1() { 
    Dummy mock = EasyMock.createMock(Dummy.class); 
    EasyMock.expect(mock.method()).andAnswer(new IAnswer<Object>() { 
     @Override 
     public Object answer() throws Throwable { 
      System.out.println("mocked method is called"); 
      return new Object(); 
     } 
    }); 

    EasyMock.replay(mock); 
    mock.method(); 
} 

@Test 
public void testSt2() { 
    Dummy mock = EasyMock.createMock(Dummy.class); 
    EasyMock.expect(mock.method()).andDelegateTo(new Dummy(new Dummy(new Object()) { 
     @Override 
     public Object method() { 
      System.out.println("mocked method is called"); 
      return new Object(); 
     } 
    }); 

    EasyMock.replay(mock); 
    mock.method(); 
} 

Результаты:

  • testSt1() не вызывает конструктор Dummy
  • testSt2() вызывает конструктор Dummy

Каковы другие отличия?

ответ

0

Целью двух методов является обеспечение различных уровней ответственности за ваши тесты. Однако ваш пример не такой уж большой.

Вот простой способ, который демонстрирует, как функционально эти два обеспечивают разные ожидания тестирования.

public String foo() throws Exception { 
    throw new Exception(); 
} 

С andAnswer, вы можете сделать издевались версию этого метода возвращать строку, даже если он никогда не вернется один на практике. Ваше использование andAnswer подразумевает ожидаемый ответ.

С andDelegateTo это всегда будет исключать Исключение. Ваше использование andDelegateTo подразумевает фактический ответ.

andAnswer означает, что ваш тестовый код обработает ответ. Например, если вы создаете ParrotAnswer для метода MockDao update, Parrot вернет обновленный объект, но Dao фактически не создается в процессе. Это хорошо для модульного тестирования, когда вы в основном проходите тестовый объект через, , но не помогает, если ваш издевавшийся метод не делает то, что вы на самом деле делаете.

andDelegateTo позволяет предоставить фактический объект, реализующий интерфейс для обработки ответа. Мы разрешаем контролируемому доступу нашего ресурса к ресурсу, а не предоставляем неограниченный доступ к полному ресурсу. Преимущество этого в том, что вы можете протестировать интеграцию в тестовую среду, но свести к минимуму фактические изменения в тестовой среде. Например, вы можете делегировать get проводному Дао для получения фактического живого значения из Db и издеваться над методом delete, поэтому вы фактически не удаляете то же самое значение во время тестирования (и вам нужно снова создать его позже, чтобы выполнить тот же тест, если он имеет статический идентификатор, например).