我有一个扩展基服务的服务,在基服务中还有一个服务是用@Autowired注释连接的,因为grails服务单元测试没有通过
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
谁能帮助如何连接bean进行单元测试?
现在可能太晚了,但我遇到了同样的问题。问题是您在Grails服务中使用了@Autowired
。在Grails服务(或控制器)中,如果bean名称与成员变量名称匹配,那么您定义的每个成员都将在启动时自动注入。
如果您使用def
,它将只匹配beanName,如果您声明一个类型,它也将匹配类。根据您的IDE支持和您的编程风格,使用def
或显式类型可能会更好。
我假定如果您使用@Autowired
,框架必须在应用程序上下文中找到bean,否则将抛出异常。在单元测试环境中,启动时不会添加Grails默认bean和resources.groovy
中的bean。框架尝试自动装配您的bean,但是在测试上下文中没有找到。因为您使用了@Autowired
,所以会抛出异常。
在服务或控制器中注入bean时不要使用@Autowired
。然后它也将在单元测试环境中启动。但是请注意,bean仍然不在那里,只是没有得到异常。因此,所有注入的成员都将为空,您必须在单元测试中使用defineBeans
闭包手动设置。
defineBeans
的Stackoverflow答案
当在grails-app
(例如src/groovy
)的之外的类中注入时,您必须始终使用@Autowired
进行注入。据我所知,在单元测试时它不会引起问题。这些定制bean还需要在单元测试环境中使用defineBeans
进行设置。
Grails Version: 2.4.2
Java版本:1.8_31
单元测试被剥夺了依赖注入。您可以通过添加
来模拟utilService
@Mock(UtilService)