[英]How to test Spring service beans that themself have autowired dependencies?
[英]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.