2013-06-07 3 views
0

В Java у меня есть абстрактный класс Place с двумя конкретными подклассами Area и Level; a Level должен иметь родителя Area. Но, пытаясь сделать модульные тесты для Level, я не хочу создавать полноценный экземпляр Area. Я вижу два пути борьбы с этим:Подклассы модульных испытаний, которые относятся друг к другу

1) Создайте интерфейс IPlace, продолженный интерфейсом IArea, который Place и Area реализации. Затем создайте класс MockArea, который реализует IArea и передает это значение Level при его тестировании.

2) Используйте насмешливый фреймворк, который автоматически создаст для меня макет объектов.

Какой способ лучше? Или есть третий способ сделать это?

+0

Есть ли причина, по которой 'Level' должен знать, что' Area' является 'Area', а не' Place'? –

+1

2) iso easy (http://code.google.com/p/powermock/, http://code.google.com/p/mockito/) –

+0

Один «уровень» не может находиться внутри другого уровня ', только внутри' Area'. –

ответ

0

Вы не даете нам причину, по которой вы не хотите создавать полноценный Area, но допустим, что он делает что-то трудное для тестирования, например, подключиться к БД или прочитать файл или что-то в этом роде. Это те зависимости, которые у него есть. Ответ на зависимость - ответ.

Например, скажем Area делает это в своем конструкторе:

public Area() {  
    //get db connection 
    //do something with db connection 
} 

Теперь, когда вы создаете Level, он будет подключаться к БД. Вот как вы бы переписать конструктор использовать Dependency Injection:

public Area(Connection con) {  
    //do something with db connection 
} 

Теперь, когда вы создаете Level, вы можете дать ему поддельный Connection и способны протестировать Level.

Теперь вы можете использовать насмешливую структуру, чтобы сделать подделку Connection. Я рекомендую Mockito.

+0

'Район' не делает ничего дорогого. Просто я новичок в модульном тестировании, и все, что я прочитал, говорит о замене всех зависимостей макетными объектами. –

+0

@MatthewCline Я не считаю родителя зависимым в плохом смысле. Просто проверьте публичные методы в «Уровне» в своих «LevelTest» и общедоступных методах в «Области» в «AreaTest». Убедитесь, что вы не тестируете одно и то же дважды. Тебе хорошо идти. –

+0

Ну, это * может * вызвать проблемы, если родитель плохо спроектирован. Я привел пример плохо спроектированного родителя. Пока вы не в такой ситуации, все в порядке. –

0

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

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

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