我需要将一个bean注入服务以使测试工作。我有这个服务类:
class ContentService {
@Autowired
Evaluator evaluator
...
}
当运行它的单元测试对应物时,它失败了说它找不到与Evaluator
bean的好候选者匹配的bean。我的理解是Grails设法为你自动实例化服务变量,但在这里它似乎缺乏一些信息来正确构建它。那将是考验:
@TestFor(ContentService)
class ContentServiceSpec extends Specification {
def setup() {
evaluator = Mock(Evaluator)
service.evaluator = evaluator
}
def "Should test..."() {
...
}
}
模拟experimentEvaluator
似乎为时已晚,并在setup()
方法的测试中手动注入它,因为它失败了:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ExperimentEvaluator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 28 more
我已经看到了defineBeans
周围的一些引用,尽管它似乎在2.5.0中不再使用了。我无法理解如何使用它,因为它没有在Grails测试文档和API文档中解释过。
我也见过doWithSpring
但同样的故事:我不知道如何使用它超越正常用法,而我需要为它创建一个模拟。
我使用Grails 2.5.0。我是Grails的新手,我迷失了一些魔力。
答案 0 :(得分:2)
您是否尝试过使用doWithSpring
,如下所示?
import grails.test.mixin.support.GrailsUnitTestMixin
@TestMixin(GrailsUnitTestMixin)
@TestFor(ContentService)
class ContentServiceSpec extends Specification {
static doWithSpring = {
evaluator(Evaluator)
}
def setup() {
service.evaluator = evaluator
}
def "Should test..."() {
...
}
}
有关详细信息,请参阅doWithSpring and doWithConfig callback methods, FreshRuntime annotation。
答案 1 :(得分:1)
您应该使用doWithSpring通过org.codehaus.groovy.grails.commons.InstanceFactoryBean
添加依赖项的模拟实例。
import org.codehaus.groovy.grails.commons.InstanceFactoryBean
@TestFor(ContentService)
class ContentServiceSpec extends Specification {
static doWithSpring = {
evaluator(InstanceFactoryBean, Mock(Evaluator), Evaluator)
}
def "Should test..."() {
...
}
}