Дразнить зависимость, которая не видна снаружи - PullRequest
4 голосов
/ 08 июня 2011

Я должен провести модульное тестирование какого-то старого кода, который не был разработан для поддержки модульного тестирования (без DI). Есть ли способ смоделировать объект, который инициализируется в открытом методе?

public int method() {

    A a = new A(ar1, arg2); //How to mock this?

}

Спасибо,

-Abidi

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Другим вариантом является рефакторинг кода в

public int method() {
   A a = createA(arg1,arg2);
}

A createA(int arg1, int arg2) {
    return new A(arg1,arg2);
}

. В вашем методе тестирования теперь вы можете использовать функции spy и doAnswer Mockito для переопределения createA в вашем тестовом устройстве с чем-то вдольстроки:

Foo foo = new Foo();
Foo spiedFoo = spy(foo); // a spied version when you can copy the behaviour
doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock inv) throws Throwable {
        A a = mock(A.class);
        return a;
    }
}).when(mySpy).createA(anyInt(), anyInt());
0 голосов
/ 08 июня 2011

Если у вас есть контроль над соответствующим кодом, вы можете реорганизовать его и сделать зависимость общедоступной, например, в зависимости от некоторого A-компоновщика.Это, вероятно, лучшее решение, поскольку оно делает ваш класс менее зависимым от A.[Заставить вас отделить ваш дизайн - одно из главных преимуществ тестирования.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...