Я новичок в Мокито.
Учитывая приведенный ниже класс, как я могу использовать Mockito для проверки того, что он someMethod
был вызван ровно один раз после того, как foo
был вызван?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Я хотел бы сделать следующий проверочный звонок,
verify(bar, times(1)).someMethod();
где bar
насмешливый экземпляр Bar
.
Ответы:
Внедрение зависимости
Если вы добавите экземпляр Bar или фабрику, которая используется для создания экземпляра Bar (или одного из других 483 способов сделать это), у вас будет доступ, необходимый для выполнения теста.
Пример фабрики:
Учитывая класс Foo, написанный следующим образом:
в вашем методе тестирования вы можете ввести BarFactory следующим образом:
Бонус: это пример того, как TDD может управлять дизайном вашего кода.
источник
Bar bar = mock(Bar.class)
вместоBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
Классический ответ: «Вы этого не делаете». Вы тестируете публичный API
Foo
, а не его внутренние компоненты .Есть ли какое-либо поведение
Foo
объекта (или, что-то менее хорошего, какого-либо другого объекта в среде), на которое влияетfoo()
? Если это так, проверьте это. А если нет, что делает метод?источник
Foo
ISpublic void foo()
, где внутренность только BAR связана.verify()
станет действительно очень полезным, даже если вы больше не поклоняетесь на святом алтаре интеграционного тестирования.Если вы не хотите использовать DI или фабрики. Вы можете немного реорганизовать свой класс:
И ваш тестовый класс:
Тогда класс, который вызывает ваш метод foo, сделает это так:
Как вы можете видеть при вызове метода таким образом, вам не нужно импортировать класс Bar в любой другой класс, который вызывает ваш метод foo, что, возможно, является тем, что вам нужно.
Конечно, недостатком является то, что вы позволяете вызывающей стороне устанавливать объект Bar.
Надеюсь, поможет.
источник
Решение для вашего примера кода с использованием
PowerMockito.whenNew
FooTest.java
JUnit выход
источник
Я думаю, что Мокито
@InjectMocks
это путь.В зависимости от вашего намерения вы можете использовать:
Больше информации в документах
Ниже приведен пример с инжекцией поля:
Классы:
Тест:
источник
Да, если вы действительно хотите / должны это сделать, вы можете использовать PowerMock. Это следует считать последним средством. С PowerMock вы можете заставить его возвращать макет от вызова конструктору. Затем сделайте проверку на макете. Тем не менее, Csturtz это «правильный» ответ.
Вот ссылка на макет строительства новых объектов
источник
Другой простой способ - добавить оператор log в bar.someMethod (), а затем убедиться, что вы можете увидеть упомянутое сообщение при выполнении теста, см. Примеры здесь: Как сделать утверждение JUnit для сообщения в регистраторе
Это особенно удобно, когда ваш Bar.someMethod ()
private
.источник