2013-12-14 5 views
0

У меня есть основное понимание в насмешках/stubbing.Понимание насмешек/stubbing - mockito

При создании окурок в тестовом коде, как:

test h = mock(test); 
when(h.hello()).thenReturn(10); 

и в исходной логики У меня есть такой код:

test src = new test(); 
src.hello(); 

Теперь будет STUB получить вызывается, так как я погасил вводное метод или Поскольку экземпляр отличается, он не будет заострен? Есть ли способ заглушить все экземпляры класса?

ответ

1

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

class TestedClass{ 
private final Helper helper; 
pubic TestedClass(Helper helper){ 
     this.helper = helper; 
} 

public aMethodUsesHelper(){ 
     //hello is weird name for method that returns int but it is link to your code 
     int aVar =this.helper.hello(); 
     …. 
} 
… 

Тогда в тестовом классе

Helper helper = mock(Helper.class); 
when(helper.hello()).thenReturn(10); 
TestedClass tested = new Tested(helper); 
….. 
+0

Отражение для установки помощника в проверке класса для моего макета также включено в опции справа? Пожалуйста, поправьте меня, если я ошибаюсь. – user1192671

+0

Да, вы можете, но только в том случае, если он назначен для поля в конструкторе, не динамически созданного в тестируемом методе. Вы можете использовать специальный загрузчик классов для загрузки макетной версии вспомогательного класса, но поверьте мне, что лучший способ - написать простой тестовый код с классами сотрудничества, переданными в конструкторе. Инструменты, такие как весна, прекрасно поддерживают его. – JosefN

+0

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

2

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

Итак, если вы хотите, чтобы писать тесты для некоторого класса Foo, который должен создавать экземпляры Bar где-то в коде, вы должны были бы впрыснуть BarFactory в Foo. Инъекция может произойти старомодным способом, передав BarFactory в конструктор или метод набора или с помощью схемы инъекции зависимостей, такой как Guice. Краткий пример старинке:

class Foo { 

    private final BarFactory mFactory; 

    public Foo(BarFactory factory) { 
     mFactory = factory; 
    } 

    public void someMethodThatNeedsABar() { 
     Bar bar = mFactory.create(); 
    } 

} 

Теперь в тестовом классе вы можете придать издевались BarFactory, что может производить издевались экземплярам Bar:

Bar mockBar = mock(Bar.class); 
BarFactory mockFactory = mock(BarFactory.class); 
when(mockFactory.create()).thenReturn(mockBar); 
Foo objectForTest = new Foo(mockFactory); 
+0

Я не понял, что вы сказали полностью. Вы говорите, что это не будет пропущено для объекта src, не так ли? – user1192671

+0

Надеюсь, редактирование достаточно хорошо объясняет. – Dave

+0

в любом случае OP может использовать «h» экземпляр теста также, вместо объекта src для stubbing – Sikorski

1

Вы должны использовать высмеивал экземпляр, чтобы получить стаб работу. Cheers :)