Вместо насмешек было бы другое решение, чтобы можно было его протестировать:
public void methodToBeTested(SomeObject obj) {
performLogic(AppConst.SOME_CONST, obj);
}
boolean performLogic(String check, SomeObject testObj) {
if (!check.equals(obj.getCostCode())) {
// some logic
return true;
}
return false;
}
Таким образом, вы можете протестировать две вещи, обе из которых вместе показывают, что ваш код работает как задумано:
public void testMethodToBeTested() {
MyBean mb = new MyBean() {
@Override
void performLogic(String check, SomeObject testObj) {
assertSame("check constant is passed", AppConst.SOME_CONST, check);
}
}
mb.methodToBeTested(new SomeObject());
mb = new MyBean();
SomeObject so = createSomeTestObject("My Code"); // not the actual constant but an equal String
assertFalse("check some logic not occurred", mb.performLogic("My Code", so));
so = createSomeTestObject("Not the constant");
assertFalse("check some logic not occurred", mb.performLogic("Not the constant", so));
assertTrue("check some logic occurred", mb.performLogic("My Code", so));
// additional tests covering the actual logic
}
Другим решением может быть помещение условия оператора if в его собственный метод, например, shouldLogicOccurr(String check)
, и проверка этого метода по отдельности.
Другими словами: иногда необходимо реорганизовать ваш код всделать тесты легче, а иногда даже возможно вообще. Хорошим побочным эффектом является то, что в следующий раз вы реализуете что-то, что уже имеете в виду тестируемость, и в первую очередь создадите свой код, подходящий для этого.
Пересмешка - это хороший способ протестировать вещи с использованием сторонних библиотек. это не может быть изменено и имеет слишком много зависимостей для настройки, но если вы в конечном итоге используете это для своего собственного кода, у вас возникнет проблема проектирования.