2009-06-30 5 views
2

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

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

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

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

ответ

8

Создайте подкласс, который перекрывает bar(), который ничего не делает.

+0

Как выглядит код клиента? Как вы создаете экземпляр класса, который теперь перекрывает bar(). Таким образом, вам придется изменить код (или фабрику), который создает новый класс. Как я сказал ниже, я думаю, нам нужно больше деталей о проблеме, в частности, может ли источник быть изменен. –

+0

Если вы решите сделать это, имейте в виду, что ваш тест будет тестировать что-то немного отличное от класса, который должен быть протестирован. Это может привести к появлению отверстий в вашем тестовом покрытии. – NamshubWriter

+0

@AdrianMouat, если это единичный тест, мы можем предположить, что мы можем создать класс, который тестируется полностью отдельно. Если это так, мы должны иметь возможность просто: новый Clazz() {/ * здесь переопределить * /} Это означает, что источник не нуждается в изменении – Egwor

1

Зачем вам это нужно?

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

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

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

1

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^