斯波克与 Spring Boot 和 Camel :与分离的模拟零交互

fcg9iug3  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(186)

我有一些问题与测试我的 Camel 上下文与Spring Boot 。
我使用的是 Spring Boot 1.5.6、斯波克1.1-groovy-2.4、 Camel 2.19.2和 Camel Spring启动器2.19.2。
我正在使用一个spock mock,并且在一个@TestConfiguration类中使用DetachedMockFactory。我所有的bean都使用构造函数注入。我正在将一个mock的@Repository注入到一个处理器@Component中,并且我还将它注入到我的测试类中以定义交互。
我用@SpringBootTest注解了我的测试,其中包含了所有Processor实现和所有RouteBuilder扩展的类列表。我还用TestConfiguration类注解了一个'@Import'。我甚至在我的测试中为这个仓库bean使用了构造函数注入!
但是,注入测试类的mock似乎并不是正在使用的mock。有人知道哪里出了问题吗?我在每次测试之前和之后都尝试过@DirtiesContext来重新加载上下文,但是没有任何帮助。

w6lpcovy

w6lpcovy1#

DetachedMocks行为不正确的问题,例如,看起来是同一个示例,通常是由一些框架将它们 Package 在代理中引起的。例如,这可能是由Spring中的@Transactional注解引起的,该注解创建了一个代理以便于JDBC会话管理。另请参见issue #758
对于spring,可以使用AopUtilsjdoc)的方法。简单的方法是使用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
lf5gs5x2

lf5gs5x22#

如果有人提出同样的问题。
Spock添加了额外的@UnwrapAopProxy代替上面提到的util方法来完成这项工作。

@SpringSpy
@UnwrapAopProxy
Service service

相关问题