2013-04-23 2 views
2

Вопрос: Есть ли инструмент, который автоматизирует обрезание или издевательство объектов (используя jmock, mockito или easy mock)?Есть ли какой-либо инструмент, который автоматизирует штампование ответов на макет объекта? (с использованием jmock, mockito или easy mock)

Мне нужно написать модульные тесты против метода, который имеет зависимости от услуг Amazon AWS (SQS/Simple Queue Service и DynamoDB). Шумные отклики объектов-объектов, как правило, очень утомительны и трудны для меня. Итак, я подумал, что было бы неплохо, если бы мы записывали и воспроизводили затушеванные ответы с использованием прокси-сервера Java (над CGLib или javassist). Я подумал о том, чтобы реализовать такую ​​идею самостоятельно, но я бы хотел проверить, когда-либо реализовал такую ​​идею.

ответ

0

Я думал об одной и той же функциональности и в конечном итоге реализовал ее самостоятельно над картой Mockito, а не CGLib. Я слышал, что кто-то разрешил Mockito на платформе Android Java, так что я могу легко переносить свой инструмент, который использует Mockito на Android. Но, насколько я знаю, мы не можем переносить любую функцию, которая зависит от CGLib или Javaassit в это время.

У меня есть открытый инструмент с именем 'bimock' (двунаправленный макет), который имеет два режима. В режиме записи он записывает вызовы методов с возвращаемыми значениями или исключениями в файл ресурсов в формате JSON. Когда он находится в режиме воспроизведения, он устанавливает вызовы методов и ответы из файла ресурсов при запуске и повторяет ответы возвратов или бросков. См. Этот пример, где я записываю публичные ответы объекта Java и реплицирует их из файла JSON.

Вы должны иметь возможность использовать этот инструмент для различных зависимостей не только для объекта Amazon AWS SDK, но и для объектов JDK, таких как HashMap, ArrayList, ByteBuffer и т. П.

public class BimockTest { 
    private Mode mode = Mode.Replay; 
    private PojoMapper pojoMapper = new PojoMapper(new BimockModule()); 
    private Bimock bimock = new Bimock(pojoMapper); 

    @Test 
    public void testRecordAndReplayMap() throws IOException { 
     val map = bimock.of(new HashMap<String, Integer>(), mode, new File("src/test/resources/test-record-and-replay-map.json")); 
     assertThat(map.put("abc", 3), equalTo(null)); 
     assertThat(map.size(), equalTo(1)); 
     assertThat(map.get("abc"), equalTo(3)); 
    } 

    @Test 
    public void testRecordAndReplayList() { 
     List<Long> list = new ArrayList<Long>(); 
     list = bimock.of(list, mode, new File("src/test/resources/test-record-and-replay-list.json")); 
     try { 
      assertThat(list.remove(-1), nullValue()); 
      fail(); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      assertThat(e.getMessage(), equalTo("-1")); 
     } 
     assertThat(list.add(100L), equalTo(true)); 
     assertThat(list.toArray(new Long[1]), equalTo(new Long[] { 100L })); 
    } 
} 
+0

Почему бы вам когда-нибудь захотеть издеваться над любым из классов в примере, когда вы можете просто использовать их? Как то, что Стив сказал ниже, вы просто создаете действительно хрупкие тесты, которые дублируют вашу производственную логику – tddmonkey

1

easymock сделал именно это в старые времена, но мы считаем, что такие тесты имеют тенденцию быть хрупкими по мере изменения кода. Мой опыт заключается в том, что если сохранение заглушек в тестах утомительно, то это ключ к дизайну тестируемого кода, который следует прослушивать. Там, вероятно, должны быть более мелкие объекты.

1

Я бы порекомендовал против этого полностью. Издевательство над библиотеками, которых вы не владеете, просто требует неприятностей (как вы уже видите), и только подтверждает, что вы взаимодействуете с библиотекой так, как вы думаете.

Если у вас есть код, который взаимодействует с SQS/DynamoDb, тогда записывайте интеграционные тесты, которые фактически идут и ударяют SQS и DynamoDb - они дадут вам гораздо более высокий уровень уверенности, чем модульные тесты, и не будут хрупкими. DynamoDb также имеет локальный экземпляр в памяти, который можно развернуть только для этой цели.

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