我在用spring引导测试我的骆驼上下文时遇到了一些问题。
我使用spring引导1.5.6,spock 1.1-groovy-2.4,骆驼2.19.2,骆驼弹簧-启动-启动2.19.2。
我使用的是斯波克模拟,在@TestConfiguration
类中使用的是@TestConfiguration
。我所有的bean都使用构造函数注入。我将一个模拟的@Repository
注入到处理器的@Component
中,我还将它注入到我的测试类中来定义交互。
我用@SpringBootTest
对我的测试进行了注释,并列出了包含所有Processor
实现和所有RouteBuilder
扩展的类列表。我的TestConfiguration
类也有一个“@Import”。我甚至在测试中为这个存储库bean使用构造函数注入!
但是,注入到测试类中的模拟似乎并不是正在使用的模拟。有没有人知道什么可能是错的?我尝试过在每次测试之前和之后重新加载上下文,但这并没有帮助。
发布于 2017-11-02 15:57:54
DetachedMocks行为不正确的问题,例如,看起来是相同的实例,通常是由某些框架将它们封装在代理中引起的。例如,这可能是由Spring中的@Transactional
注释引起的,它创建了一个代理以方便jdbc管理。也请参阅发布#758
对于spring,可以使用AopUtils
(jdoc)的方法。简单的方法是使用AopUtils.isAopProxy
检查它是否由spring代理,然后展开它。
public static <T> T getTargetObject(Object proxy) throws Exception {
if (AopUtils.isAopProxy(proxy)) {
return (T) ((Advised) proxy).getTargetSource().getTarget();
} else {
return (T) proxy;
}
}
在一次测试中
def "sample service test"() {
given:
def sampleRepositryMock = getTargetObject(sampleRepositry)
when:
sampleService.doSomething() // simply invoke sampleRepositry.doSomething() in it
then:
1 * sampleRepositryMock.doSomething()
0 * _
}
编辑:从Spock 1.2开始,就有一个扩展来自动展开注入bean @UnwrapAopProxy
。
@Inject
@UnwrapAopProxy
SampleRepositry sampleRepositryMock
发布于 2020-11-03 11:46:16
如果有人想出同样的问题。
Spock添加了额外的@UnwrapAopProxy
,它将为您完成工作,而不是上面提到的util方法。您还可以删除DetachedMockFactory
@SpringSpy
@UnwrapAopProxy
Service service
https://stackoverflow.com/questions/47053837
复制相似问题