0

我在使用 spring boot 测试我的骆驼上下文时遇到了一些问题。

我正在使用 spring boot 1.5.6、spock 1.1-groovy-2.4、camel 2.19.2 和 camel-spring-boot-starter 2.19.2。

我正在使用 spock 模拟,并且我DetachedMockFactory@TestConfiguration课堂上使用。我所有的 bean 都使用构造函数注入。我将一个模拟@Repository注入到其中一个处理器@Component中,我还将它注入到我的测试类中以定义交互。

我的测试用@SpringBootTest包括所有Processor实现和所有RouteBuilder扩展的类列表进行了注释。我的TestConfiguration班级也有一个“@Import”。我什至在我的测试中为这个存储库 bean 使用构造函数注入!

但似乎注入测试类的模拟不是正在使用的模拟。有谁知道可能出了什么问题?我试图@DirtiesContext在每次测试之前和之后重新加载上下文,但这没有帮助。

4

2 回答 2

1

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

Spock 添加了额外@UnwrapAopProxy的内容,而不是上面提到的 util 方法。你也可以放下DetachedMockFactory

@SpringSpy
@UnwrapAopProxy
Service service
于 2020-11-03T11:46:16.040 回答
0

DetachedMocks 行为不正确的问题,例如,看起来是同一个实例,通常是由某些框架将它们包装在代理中引起的。例如,这可能是由@TransactionalSpring 中的注释引起的,它创建了一个代理来促进 jdbc-session 管理。另请参阅问题#758

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

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 * _                   
}
于 2017-11-02T15:57:54.437 回答