【发布时间】:2015-09-17 18:54:33
【问题描述】:
我需要将 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 的新手,我迷失在它的一些魔力中。
【问题讨论】:
-
Evaluator和ExperimentEvaluator长什么样子? -
抱歉,我重新编辑了答案,但 Evaluator 和 ExperimentEvaluator 是相同的。此代码来自专有代码库,因此我不能简单地将其转储在这里。
Evaluator类是 Java 并且没有空的构造函数。实例化并不容易,模拟它并将其注入服务会更容易(+本着单元测试的精神:))。
标签: spring unit-testing grails spock