首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring和Camel的Spock :与分离模拟的零交互

Spring和Camel的Spock :与分离模拟的零交互
EN

Stack Overflow用户
提问于 2017-11-01 11:31:30
回答 2查看 586关注 0票数 1

我在用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使用构造函数注入!

但是,注入到测试类中的模拟似乎并不是正在使用的模拟。有没有人知道什么可能是错的?我尝试过在每次测试之前和之后重新加载上下文,但这并没有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-02 15:57:54

DetachedMocks行为不正确的问题,例如,看起来是相同的实例,通常是由某些框架将它们封装在代理中引起的。例如,这可能是由Spring中的@Transactional注释引起的,它创建了一个代理以方便jdbc管理。也请参阅发布#758

对于spring,可以使用AopUtils (jdoc)的方法。简单的方法是使用AopUtils.isAopProxy检查它是否由spring代理,然后展开它。

代码语言:javascript
运行
复制
public static <T> T getTargetObject(Object proxy) throws Exception {
    if (AopUtils.isAopProxy(proxy)) {
        return (T) ((Advised) proxy).getTargetSource().getTarget();
    } else {
        return (T) proxy;
    }
}

在一次测试中

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@Inject
@UnwrapAopProxy
SampleRepositry sampleRepositryMock
票数 1
EN

Stack Overflow用户

发布于 2020-11-03 11:46:16

如果有人想出同样的问题。

Spock添加了额外的@UnwrapAopProxy,它将为您完成工作,而不是上面提到的util方法。您还可以删除DetachedMockFactory

代码语言:javascript
运行
复制
@SpringSpy
@UnwrapAopProxy
Service service
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47053837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档