如何在针对服务的spock测试中模拟自动装配的bean?

时间:2015-09-17 18:54:34

标签: spring unit-testing grails spock

我需要将一个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的新手,我迷失了一些魔力。

2 个答案:

答案 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..."() {
       ...
    }

}