У меня есть Пользователь класса домена:
class User extends AuditableEntity {
private static final long serialVersionUID = 1
String username
String password
String email
String googleId
String linkedinId
boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired
Set<Role> getAuthorities() {
(UserRole.findAllByUser(this) as List<UserRole>)*.role as Set<Role>
}
static constraints = {
password nullable: true, blank: true, password: true
username nullable: false, blank: false, unique: true
email nullable: false, blank: false, unique: true
googleId nullable: true, blank: true, unique: true
linkedinId nullable: true, blank: true, unique: true
}
static mapping = {
password column: '`password`'
googleId column: 'google_id'
linkedinId column: 'linkedin_id'
}
static namedQueries = {
notDeleted {
isNull 'deletedAt'
}
}
}
Где AuditableEntity имеет только поля, допускающие значение NULL.
Еще у меня есть простой сервисный класс UserService:
@Transactional
class UserService {
@Transactional(readOnly = true)
User getByGoogleId(String googleId) {
def user = User.notDeleted.findByGoogleId(googleId)
user
}
}
Я пытаюсь написать модульный тест для класса обслуживания, высмеивая домен пользователя:
class UserServiceSpec extends Specification implements ServiceUnitTest<UserService>, DataTest {
def setupSpec() {
mockDomain User
}
void "getByGoogleId"() {
setup:
new User(
username: "username",
googleId: "googleId",
email: "[email protected]",
enabled: true,
accountExpired: false,
accountLocked: false,
passwordExpired: false
).save(failOnError: true)
when:
def user = service.getByGoogleId("googleId")
then:
User.count() == 1
user.username == "username"
}
}
Этот тест не проходит, так как по какой-то причине пользовательский объект не создается. User.count() равен 0.
Это не проблема проверки, так как ошибок проверки домена нет (они были раньше).
Что я делаю неправильно?





Попробуйте добавить флеш при создании своего домена:
...
new User(
username: "username",
googleId: "googleId",
email: "[email protected]",
enabled: true,
accountExpired: false,
accountLocked: false,
passwordExpired: false
).save(failOnError: true, flush: true)
...
Я скопировал вашу установку, и это все, что требовалось.
Ознакомьтесь с документацией по сохранению здесь, docs.grails.org/latest/ref/Domain%20Classes/save.html, я предполагаю, что без сброса вставка была обработана спящим режимом, и поскольку после этого не происходит никаких других обновлений, вставка не выполняется
Спасибо за это. Интересно, почему это никак не задокументировано.