Слишком много зависимостей в Mocking: вопрос модульного теста - PullRequest
4 голосов
/ 28 января 2011

Я хочу провести тест бизнес-класса, и у меня возникла следующая проблема: один из объектов-насмешников имеет много зависимостей от других классов, таких как Sites, URL и ComplexObject.

Мой вопрос: как я могу изолировать свой класс, если мне нужно использовать этот метод моего фиктивного объекта в методе, который мне нужно проверить? Должен ли я издеваться над всеми из них и добавить их к высмеиваемому объекту?

Ответы [ 2 ]

4 голосов
/ 28 января 2011

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

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

0 голосов
/ 28 января 2011

Что мне нравится делать, так это создавать класс, имеющий поле для всех внешних зависимостей, а также статические методы. например:

public class DanceMakerDependecies{
    private URL url;

    public String getCurrentUser(){ // not static, so very easy to test
        return UserManager.currentUser().getName();
    }

    //getter and setters
}

public class DanceMaker{
     public DanceMaker(DanceMakerDependecies dep){
     ..
     }
     // you could also create default constructor with the default dependencies
}

public class DanceMakerTest{
    @Test
    void dance(){
        DanceMaker dm = new DanceMaker();
        dm.setDependecies(EasyMock.createMock(DanceMakerDependecies.class));
        //etc.
    }
}

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

...