2016-09-26 3 views
1

я следующий код в моем приложении:Как запрограммировать ошибку для проверки отката базы данных?

try { 
    //start transaction 
    repository.startTransaction(); 

    //carry out deletion logic 
    repository.deletedata() 

    //commit all 3 transactions 
    repository.commitTransaction(); 

} catch (Exception e) {  
    repository.rollback(); 
} 

Как я могу намеренно бросаться error в этот код, чтобы проверить, если данные правильно быть откат?

+1

'throw new Exception (" test exception ");' –

+0

Использовать 'throw new Exception (...)' statement? – RealSkeptic

+0

Когда я это делаю, ниже в моем repository.commitTransaction(); метод, я получаю сообщение «unreachable statement» compile error – java123999

ответ

1

Вы испытываете ошибку здесь.

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

Тогда у вас есть еще один блока теста, который просто убеждается, что всякий раз, когда есть исключение в вашей Ьге блока, что ожидаемый вызов откате происходит.

Если вы действительно хотите сделать функциональный тест , что делает конец 2-конец тестирования, включая откат, то вы должны добавить некоторые инъекцию механизм, что-то вроде:

interface ErrorInject { 
    void throwException(); 
} 

и в вашем попробуйте блок, у вас будет что-то вроде:

try { 
    repository.startTransaction(); 
    inject1.throwException(); 
    repository.deletedata() 
    inject2.throwException(); 
    repository.commitTransaction(); 
} 

и по умолчанию эти два объекта «впрыскивания» просто ничего не делают; но для вашего тестового примера вы убедитесь, что один из этих двух объектов действительно вызывает исключение.

Но, конечно же, вы не хотите делать что-то подобное в своем производственном коде. Итак - вам лучше отступить и подумать, будет ли мое первое предложение работать на вас.

Возможна одна альтернатива Аспектно-ориентированное программирование; который может позволить вам использовать некоторую аннотацию, например, чтобы проинструктировать вашу инфраструктуру сбой при некотором вызове метода. Но, как сказано: вы не должны загрязнять ваш производственный код «аспектами тестирования».