Как заглушить отдельный метод в java для модульного тестирования?

У меня есть метод в классе, который записывает некоторую строку, которая вызывает другой метод, который делает то же самое. Что-то вроде:

void foo() {
  a += "xyx";
  bar();
}

void bar() {
  a += "abc";
}

Для модульного тестирования я хочу протестировать foo и bar отдельно. Есть ли способ предотвратить запуск bar при вызове foo() или заменить его другим методом?


person swampsjohn    schedule 30.06.2009    source источник


Ответы (3)


Создайте подкласс, который переопределяет функцию bar(), которая ничего не делает.

person Egwor    schedule 30.06.2009
comment
Как будет выглядеть клиентский код? Как вы создаете экземпляр класса, который теперь переопределяет bar(). Итак, вам придется изменить код (или фабрику), который создает экземпляр нового класса. Как я сказал ниже, я думаю, что нам нужно больше деталей по проблеме, в частности, можно ли изменить источник. - person Adrian Mouat; 01.07.2009
comment
Если вы решите это сделать, имейте в виду, что ваш тест будет тестировать что-то немного отличное от класса, который он должен тестировать. Это может привести к дырам в вашем тестовом покрытии. - person NamshubWriter; 01.07.2009
comment
@AdrianMouat, если это модульный тест, мы должны предположить, что можем создать класс, который тестируется полностью отдельно. Если это так, мы должны иметь возможность просто сделать: new Clazz() { /* поместите здесь переопределение */ } Это означает, что исходный код не нужно изменять. - person Egwor; 08.12.2013

Почему вы хотите это сделать?

Вы можете перехватить код на уровне байтового кода, используя аспекты (не разумно); вы можете взять объект, который вызывает bar: void foo(MyBarObject m) { a += "xyx"; m.bar(); }

Но, как я уже сказал, я не могу понять, почему это полезно. Модульный тест предназначен для тестирования общедоступного интерфейса. Если bar() является закрытым или защищенным, то он автоматически проверяется с помощью вашего вызова и последующих утверждений к foo(). Если и foo(), и bar() общедоступны, круто, протестируйте их отдельно.

Можете ли вы опубликовать реальный пример? Можете ли вы изменить тестируемый код? И т. д.

person Adrian Mouat    schedule 30.06.2009

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

void foo() {
  a += "xyx";
}

void bar() {
  a += "abc";
}

void fooBar() {
  foo();
  bar();
}

было бы легко провести модульное тестирование.

person dcoke23    schedule 30.06.2009