Я пишу модульные тесты для проекта, использующего testng и Mockito2. Я хочу издеваться над несколькими методами, которые делают исходящие запросы. Теперь объект для моделирования создается локально в методе другого объекта. Итак, если я скажу, 4 класса, A, B, C и D, такие, что A создает объект типа B, B создает объект типа C и так далее, и объект типа D должен быть смоделирован, я видите, у меня есть два варианта, чтобы высмеять это.
Вариант 1 состоит в том, чтобы шпионить за объектами типа A, B, C и вводить шпион B в A и C в B и, наконец, вводить макет D в C во время создания объекта. Ниже приведен пример.
class A {
public B createB()
{
retrun new B();
}
public void someMethod ()
{
B b = createB();
}
}
Таким образом, я могу следить за A и вводить фиктивный объект для B, когда вызывается createB. Таким образом, я могу в конечном итоге издеваться над Д.
Вариант 2 состоит в том, чтобы не издеваться над прерывистыми классами и напрямую иметь класс Factory, как показано ниже:
class DFactory {
private static D d;
static public void setD (D newD)
{
d = newD;
}
public static D getD()
{
if (d!=null)
{
return d;
} else
{
return new D();
}
}
}
Вышеприведенный вариант прост, но я не уверен, что это правильно, поскольку он создает больше статических методов, чего, я считаю, следует избегать.
Я хотел бы знать, какой метод должен быть предпочтительным, и есть ли какая-либо другая альтернатива.
Обратите внимание, что я не хочу использовать powermockito или любые другие подобные фреймворки, которые поощряют плохой дизайн кода. Я хочу придерживаться mockito2. Я в порядке с рефакторингом моего кода, чтобы сделать его более тестируемым.