从外部grails项目引用域对象 - 类[]上的方法在Grails应用程序之外使用

时间:2014-08-06 11:47:22

标签: grails gorm integration-testing grails-domain-class

我在Eclipse中有两个Grails项目。我使用Configure Build Path设置引用另一个项目。但是,运行测试会引发错误java.lang.IllegalStateException: Method on class [com.example.domain.Phone] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

通常使用@Mock(使用Mockito)或mockDomain()修复此问题,但我不在单元测试中,因此不会看到这些项目。

如果无法看到我需要使用的域对象,如何通过集成测试测试我的服务层?这些域对象是分开的,因为需要在多个项目中使用它们。

3 个答案:

答案 0 :(得分:2)

如果您的GORM类与Application类不在同一个包中,则需要将ComponentScan注释添加到Application类以指示GORM类的位置。例如:

@ComponentScan(basePackages=['foo.bar', 'my.company'])
class Application {
....

答案 1 :(得分:1)

可以使用GORM for Spring Boot。 https://spring.io/guides/gs/accessing-data-gorm/

中的示例

如果您正在编写测试,则可以使用HibernateTestMixin或使用HibernateDatastoreSpringInitializer初始化GORM。

答案 2 :(得分:1)

如果您正在编写测试,请不要忘记:

  1. Spec中的注释。 @IntegrationTest很重要

    @ContextConfiguration(loader = SpringApplicationContextLoader, classes = ConfigTest)
    @EnableAutoConfiguration
    @IntegrationTest
    class PaymentServiceSpec extends Specification{
      // Tests with GORM entities
    }
    
  2. 注入hibernate的类

    @SpringBootApplication
    @Import(HibernateGormAutoConfiguration)
    class CoreConfigTest {
    }
    
  3. 由于@IntegrationTest,必须有一个Application类用于测试

    @SpringBootApplication
    class TestApplication {
      static void main(String[] args) {
        run TestApplication, args
      }
    }
    
  4. 我正在使用此依赖项:

      runtime 'org.postgresql:postgresql:9.3-1102-jdbc41'
    
      compile("org.grails:gorm-hibernate4-spring-boot:1.1.0.RELEASE") {
          exclude module: 'spring-boot-cli'
          exclude module: 'groovy-all'
        }
    
      compile("org.springframework.boot:spring-boot-starter-jdbc:1.2.2.RELEASE")