grails服务单元测试自动装配

时间:2014-06-03 15:04:21

标签: grails

我有一项服务正在扩展基本服务,而在基本服务中,由于Grails服务单元测试未通过,因此还有一项服务与@Autowired注释相连接

class UserService extends BaseService{

    def getUser() {
    def u = [:]
    u.name='jason'
    return u
    }
}



import org.springframework.beans.factory.annotation.Autowired

class BaseService {
    @Autowired(required = true)
    UtilService utilService
}


import grails.test.mixin.*
import org.junit.*

@TestFor(UserService)
class UserServiceTests {
   void testSomething() {
       fail "Implement me"
   }
}

在运行$ grails test-app时遇到错误

    | Failure:  testSomething(com.krish.web.service.UserServiceTests)
    |  org.springframework.beans.factory.BeanCreationException: Error creating bean with     name 'userService': Injection of autowired dependencies failed; nested exce
ption is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.krish.web.service.UtilService ProcurementBase
Service.utilService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.krish.web.ser
vice.UtilService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.spring
framework.beans.factory.annotation.Autowired(required=true)}
        at grails.test.mixin.services.ServiceUnitTestMixin.mockService(ServiceUnitTestMixin.groovy:54)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.krish.web.service.UtilService Ba
seService.utilService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.krish.web.s
ervice.UtilService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.spri
ngframework.beans.factory.annotation.Autowired(required=true)}
        ... 1 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.krsih.web.service.UtilService] found for de
pendency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annota
tion.Autowired(required=true)}

grails版本为2.1.0

任何人都可以帮助如何连线豆进行单元测试吗?

2 个答案:

答案 0 :(得分:0)

单元测试被剥夺了依赖注入。您可以通过添加

来模拟utilService
@Mock(UtilService)

在班级的测试班。

答案 1 :(得分:0)

现在可能为时已晚,但我遇到了同样的问题。问题是您在Grails服务中使用@Autowired。在Grails服务(或控制器)中,如果bean名称与成员变量名称匹配,则在启动时将自动注入您定义的每个成员。

如果你使用def,它只会匹配beanName,如果你声明一个类型,它也会匹配该类。根据您的IDE支持 - 以及您的编程风格 - 使用def或显式类型可能更好。

我认为如果你使用@Autowired,框架必须在应用程序上下文中找到bean,否则抛出异常。在单元测试环境中,您的Grails默认bean和resources.groovy中的bean不会在启动时添加。框架尝试自动装配您的bean,但在测试上下文中找不到。因为您使用@Autowired,所以会抛出异常。

在服务或控制器中注入bean时忽略@Autowired。然后它也将在单元测试环境中启动。但请注意,豆子仍然没有,你只是没有得到例外。因此,所有注入的成员都将为null,您必须使用defineBeans闭包在单元测试中手动设置它。

Stackoverflow answer on how to use defineBeans within a unit test

但是,当注入grails-app之外的 类(例如src/groovy)时,您必须始终使用@Autowired进行注入。就我而言,这里不会在单元测试时引起问题。还需要在单元测试环境中使用defineBeans设置这些自定义bean。

Grails版本:2.4.2

Java版本:1.8_31