как вы предоставляете глубинные макеты объектов? - PullRequest
4 голосов
/ 19 сентября 2011

Я не думаю, что я понимаю тестирование, а следует. Я написал много тестов и получил приличное освещение, но не могу не чувствовать, что это не было интуитивно понятно.

Позвольте мне объяснить: если у меня есть класс, я тестирую метод, и ему нужно передать какой-то большой объект со всеми видами состояний. Этот объект в свою очередь содержит другие объекты и их состояния, о которых я ничего не знаю, как мне создать фиктивные или заглушки для этого метода и передать ему данные, с которыми он может работать. Кажется, мне нужно создать большой объект со всеми видами внутренней информации об объектах, чтобы использовать мой метод. Я явно запутался!

Ответы [ 4 ]

6 голосов
/ 19 сентября 2011

Другие ответы здесь указывают на насмешливые фреймворки, на которые вы обязательно должны обратить внимание, если вы еще не используете (используйте Mockito!). Тем не менее, это почти наверняка пример ваших тестов, говорящих вам, что у вас есть проблемы с дизайном. Если вам нужно предоставить все виды несвязанной информации и макетов объектов только для того, чтобы пройти тест, то вы

  1. пытается протестировать слишком много образцов одновременно,
  2. написание теста, который будет очень трудно прочитать и понять, когда вы закончите с ним, потому что невозможно определить, на что должен фокусироваться тест из-за низкого отношения сигнал / шум, и / или
  3. написание чрезвычайно хрупкого теста, который сломает малейшее, не связанное с этим изменение, повлечет за собой высокие затраты на обслуживание и менталитет "просто сделай тест пройден", которому все равно, какой тест предполагается тестировать.

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

Если вы заботитесь о хорошем тестировании, примите во внимание тестовое мышление и TDD. Я настоятельно рекомендую пару книг по этому предмету: "Тестовые шаблоны xUnit" , которые я прочитал и рецензировал , и "Растущее объектно-ориентированное программное обеспечение, руководствуясь Тесты ", которые я почти закончил читать.

3 голосов
/ 19 сентября 2011

То, что вы хотите, это насмешливый фреймворк.Их много.Взгляните на Mockito или EasyMock .

Короче говоря, вы будете использовать код, который выглядит следующим образом:

when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());

, который позволяетВы должны указать поведение при вызове определенного метода без макета всего объекта.Если у вас очень сложный объект, вы издеваетесь, он будет немного сложнее, но вы просто указываете поведение, которое ожидаете увидеть используемым.

0 голосов
/ 19 сентября 2011

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

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

В Mockito при создании макета может возникнуть глубокая заглушка: Пример на официальном сайте

0 голосов
/ 19 сентября 2011

Один из способов справиться с объектом с большим количеством состояний и зависимых объектов, который вас не волнует, - использовать «хороший макет» в EasyMock (я думаю, по умолчанию в Mockito) Это всегда будет возвращать «пустые» значения для любого метода вашего фиктивного объекта (ноль, 0 или пустая строка).

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

Например, в EasyMock это будет выглядеть примерно так:

Mock mock = createNiceMock(MyClass.class);
// override default 'empty' returns for values you care about
// this could return a mock instead
ChildObj c = new ChildObj("state");
expect(mock.getChildObj()).andReturn(c);
// replay, call methods on object under test, verify here

Но вы, вероятно, хотите начать с более широкой картины: почему вы используете насмешки? Некоторые люди предпочитают тестировать только с реальными объектами и заглушками, в то время как другие предпочитают издеваться. Погуглите «mocks v. Stubs» и прочитайте топ-3 или 4 результатов, которые помогут вам решить, подходят ли вам макеты.

...