MissingMethodException в модульном тесте с HibernateTestMixin при использовании динамического поиска после обновления до Grails 3.0.6

После обновления приложения Grails 2.5.1 до Grails 3.0.6 у меня возникли проблемы с возобновлением работы модульных тестов.

У меня есть очень простой класс домена под названием Team.

class Team {

   String name
   String shortName
   String image = 'noimage.jpg'

   static constraints = {
       name nullable: false, maxSize: 30, unique: true
       shortName nullable: true, maxSize: 5
       image nullable: false, maxSize: 30
   }
}

и модульный тест, который делает это

@TestMixin(HibernateTestMixin)
@Domain([Team])
class TeamSpec extends Specification {

    def setup() {
        new Team(name: 'Hello', shortName: 'Big').save()
    }

    def cleanup() {
    }

    void "test something"() {
        expect:"fix me"
            !Team.findByName('hello')
    }
}

Когда я выполняю модульный тест, я получаю следующую ошибку времени выполнения

groovy.lang.MissingMethodException: No signature of method: static abc.Team.findByName() is applicable for argument types: (java.lang.String) values: [hello]
at abc.TeamSpec.test something(TeamSpec.groovy:24)

Он жалуется на динамический поиск, который был доступен в Grails 2.5.x. Может ли кто-нибудь помочь мне решить эту проблему? У кого-нибудь было такое раньше?

ИЗМЕНИТЬ

Я создал простой новый Grails 3.0.6 и сгенерировал класс предметной области с помощью задачи create-domain-class. Затем я добавил в класс три атрибута String (name, shortName, image) и написал простое утверждение !Team.findByName('A'), но исключение осталось.

EDIT 2 Я до сих пор не знаю, что я делаю неправильно. Я сообщил об этой проблеме в системе отслеживания ошибок Grails-Core. Пример кода можно найти здесь

EDIT 3 @TestFor выполняет свою работу, но я хотел бы работать с HibernateTestMixin вместо DomainClassUnitTestMixin в пользу базы данных H2 в памяти. Поэтому я добавил

testCompile 'org.grails:grails-datastore-test-support:4.0.5.RELEASE'

к моему build.gradle. Но когда я добавляю HibernateTestMixin, я получаю следующее исключение.

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.grails.datastore.mapping.simple.SimpleMapDatastore] is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at grails.test.mixin.domain.DomainClassUnitTestMixin.getSimpleDatastore(DomainClassUnitTestMixin.groovy:76)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomains(DomainClassUnitTestMixin.groovy:86)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:119)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:118)
at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:153)
at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:84)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:88)
at org.spockframework.runtime.extension.builtin.AbstractRuleInterceptor$1.evaluate(AbstractRuleInterceptor.java:37)
at grails.test.runtime.TestRuntimeJunitAdapter$1$2.evaluate(TestRuntimeJunitAdapter.groovy:46)
at org.spockframework.runtime.extension.builtin.TestRuleInterceptor.intercept(TestRuleInterceptor.java:38)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:88)
at org.spockframework.runtime.extension.builtin.AbstractRuleInterceptor$1.evaluate(AbstractRuleInterceptor.java:37)
at grails.test.runtime.TestRuntimeJunitAdapter$3$4.evaluate(TestRuntimeJunitAdapter.groovy:73)
at org.spockframework.runtime.extension.builtin.ClassRuleInterceptor.intercept(ClassRuleInterceptor.java:38)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

person saw303    schedule 13.09.2015    source источник


Ответы (2)


Все должно работать нормально — в этом примере используется Grails 3.0.1. http://grails.github.io/grails-doc/3.0.1/guide/testing.html#unitTestingDomains

Я предполагаю, что использование аннотации @TestFor может вам помочь. Он установит все необходимые миксины в зависимости от того, что вы тестируете. Вот мой рабочий пример, который находится по адресу

/src/test/groovy/grails3test/TeamSpec.groovy:

package grails3test

import grails.test.mixin.TestFor
import spock.lang.Specification

/**
 * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions
 */
@TestFor(Team)
class TeamSpec extends Specification {

    def setup() {
        Team t = new Team(name: 'alphabravo')
        t.save()
    }

    def cleanup() {
    }

    void "test something"() {
        expect:
        Team.findByName('alphabravo') != null
    }
}
person Scott Langeberg    schedule 16.09.2015
comment
Этот пример работает. Спасибо. Я хотел бы использовать HibernateTestMixin с H2 в БД памяти. Как только я добавляю аннотацию @HibernateTestMixin, я получаю исключение. Является ли org.grails:grails-datastore-test-support:4.0.5.RELEASE каким-то образом несовместимым с Grails 3.0.x? См. выше в EDIT 3 - person saw303; 17.09.2015

Такое поведение официально является ошибкой, которая будет исправлена ​​в выпуске Grails 3.0.8.

Ссылка на ошибку

person saw303    schedule 25.09.2015