Эта ошибка вызвана при взаимодействии с Горм лицами, которые не были должным образом зарегистрированы в GORM. Ошибка не имеет никакого отношения к тому, где инициируется взаимодействие с (src/groovy
, grails-app/services/
и т. Д.).
Не всегда, но чаще всего эта ошибка возникает в среде тестирования, где тип объекта не был зарегистрирован в GORM.
Просмотреть проект в https://github.com/jeffbrown/illegalaccessgorm. Этот проект содержит следующее.
Класс домена:
// grails-app/domain/demo/Person.groovy
package demo
class Person {
String name
}
Служба:
// grails-app/services/demo/HelperService.groovy
package demo
class HelperService {
int getNumberOfPeople() {
Person.count()
}
}
Класс утилиты:
// src/groovy/demo/SomeHelper.groovy
package demo
class SomeHelper {
int getNumberOfPeople() {
Person.count()
}
}
Тест модуль для службы:
// test/unit/demo/HelperServiceSpec.grovy
package demo
import grails.test.mixin.TestFor
import spock.lang.Specification
@TestFor(HelperService)
@Mock(Person)
class HelperServiceSpec extends Specification {
void "test gorm method"() {
expect:
service.numberOfPeople == 0
}
}
модульный тест для класса утилиты:
// test/unit/demo/SomeHelperSpec.groovy
package demo
import spock.lang.Specification
@Mock(Person)
class SomeHelperSpec extends Specification {
void "test gorm method"() {
given:
def helper = new SomeHelper()
expect:
helper.numberOfPeople == 0
}
}
Оба эти тесты проходят. Если удалить @Mock(Person)
из любого из них, тест потерпит неудачу со следующим:
java.lang.IllegalStateException: Method on class [demo.Person] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
Если проблема возникает в том или ином контексте, кроме теста, узнать больше о контексте было бы полезно. Другими вероятными подозреваемыми являются Java-объекты, которые по какой-то причине не инициализируются должным образом, а в некоторых случаях классы домена, вносимые из плагинов, могут быть проблематичными.
Кроме того, важно знать, какая версия Grails вы используете.
Я надеюсь, что все имеет смысл.
Вам нужно предоставить больше контекста для вашего вопроса. Где вы используете свои классы в 'src/groovy'? Что называется, и, в свою очередь, называет ваши классы домена? Постарайтесь предоставить более подробные сведения о своем вопросе, с фактическими примерами того, что вы делаете, и получите более качественные ответы. –
импорта com.chatportal.ShiroUser класс ChatUtility { \t статические основные (арг) { \t \t Защиту chatUtility = новый ChatUtility() \t \t chatUtility? .display (1) \t} \t \t четкости дисплей (Защита идентификатор) { \t \t Println "ChatUtility Чат Пользователь:" + ShiroUser.get (идентификатор) \t} } –
ли ошибка происходит в тесте или в т он работает приложение? –