Вы испытываете ошибку здесь.
Вы должны делать две вещи вместо этого: вы пишите тест, который гарантирует, что ваш метод откат делает то, что он обещает сделать. Вы проверяете это на стороне.
Тогда у вас есть еще один блока теста, который просто убеждается, что всякий раз, когда есть исключение в вашей Ьге блока, что ожидаемый вызов откате происходит.
Если вы действительно хотите сделать функциональный тест , что делает конец 2-конец тестирования, включая откат, то вы должны добавить некоторые инъекцию механизм, что-то вроде:
interface ErrorInject {
void throwException();
}
и в вашем попробуйте блок, у вас будет что-то вроде:
try {
repository.startTransaction();
inject1.throwException();
repository.deletedata()
inject2.throwException();
repository.commitTransaction();
}
и по умолчанию эти два объекта «впрыскивания» просто ничего не делают; но для вашего тестового примера вы убедитесь, что один из этих двух объектов действительно вызывает исключение.
Но, конечно же, вы не хотите делать что-то подобное в своем производственном коде. Итак - вам лучше отступить и подумать, будет ли мое первое предложение работать на вас.
Возможна одна альтернатива Аспектно-ориентированное программирование; который может позволить вам использовать некоторую аннотацию, например, чтобы проинструктировать вашу инфраструктуру сбой при некотором вызове метода. Но, как сказано: вы не должны загрязнять ваш производственный код «аспектами тестирования».
'throw new Exception (" test exception ");' –
Использовать 'throw new Exception (...)' statement? – RealSkeptic
Когда я это делаю, ниже в моем repository.commitTransaction(); метод, я получаю сообщение «unreachable statement» compile error – java123999