簡體   English   中英

如何在針對服務的 spock 測試中模擬自動裝配的 bean?

[英]How to mock autowired beans in a spock test meant for a service?

我需要將一個 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 的新手,我迷失在它的一些魔力中。

您是否嘗試過使用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 和 doWithConfig 回調方法、FreshRuntime 注釋原始鏈接不再有效;新鏈接指的是 Grails 3.x 但仍與 dowithspring 符號相關)。

您應該使用 doWithSpring 通過使用 org.codehaus.groovy.grails.commons.InstanceFactoryBean 添加您的依賴項的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..."() {
       ...
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM