Используя Grails 2.0.0, я создал сервис, который создает экземпляры класса Player и сохраняет его в базе данных. Затем я написал интеграционный тест JUnit, который проверяет, что метод службы createNewPlayer (String platformID) выдает исключение, если в Player.save не удалось выполнить проверку ограничения (failOnError: true).
Все идет хорошо, но после метода shouldFail (...), если я вызываю:
assert Player.list().size() == 1;
Я получаю эту ошибку:
--Output from testCreatingNewPlayerWithExistingID--
| Error 2012-02-15 21:52:05,293 [main] ERROR hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in test1.Player entry (don't flush the Session after an exception occurs)
У меня вопрос: как проверить выбрасывание исключений внутри метода shouldFail, чтобы Hibernate не сохранял в памяти недопустимые экземпляры классов Player с нулевыми идентификаторами после этого?
Ниже приведены примеры кода:
class WorkingService
{
Player createNewPlayer(String platformID) throws ValidationException {
Player player = new Player(platformID: platformID);
return player.save(failOnError : true);
}
}
class Player
{
String platformID
static constraints = {
platformID nullable: false, blank: false, unique: true
}
}
@TestFor(WorkingService)
class WorkingServiceTests
{
WorkingService workingService;
void testCreatingNewPlayerWithExistingID()
{
def player = new Player(platformID: "1");
player.save(flush: true);
assert Player.list().size() == 1;
shouldFail ValidationException, {
player = workingService.createNewPlayer("1");
}
assert Player.list().size() == 1;
}
}