当前位置: 首页 > 知识库问答 >
问题:

带Spring靴和骆驼的Spock:与分离模拟的零交互

华展鹏
2023-03-14

我在用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模拟,我使用的是@TestConfiguration类中的DetachedMockFactory。我所有的bean都使用构造函数注入。我正在将一个模拟的@repository注入到一个处理器@component中,我还将它注入到我的测试类中以定义交互。

我用@SpringBootTest对测试进行了注释,其中的类列表包括所有Processor实现和所有RouteBuilder扩展。我的TestConfiguration类还有一个'@import'。我甚至在测试中为这个存储库bean使用构造函数注入!

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

共有1个答案

袁永贞
2023-03-14

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 * _                   
}
 类似资料:
  • 没有“org.apache.camel.CamelContext”类型的合格bean可用:应至少有一个合格的自带候选bean。 依赖项注释:{@org.SpringFramework.Beans.Factory.Annotation.AutoWired(required=true)}

  • 我有哪些选项可以将Kafka与Spring靴骆驼连接? 我正在运行ActiveMQ Artemis和Camel,以建立进出客户端的JMS/MQTT和REST路由。我想把Kafka添加到这个二重唱中,以流式传输/交换数据(视频音频、文件/文本)。 到目前为止,我下载了Kafka汇合平台(免费试用),我正在测试他们提供什么。在融合平台中,我看到有可能将连接器作为“插件”添加。我假设我可以添加Camel

  • 我有一个Spring Boot2.25.1应用程序,它使用Camel 2.25.1与camel-kafka,一切都正常工作…在我的Kafka消费者中,我需要添加该功能以按需暂停消费,因此我升级到camel 3.18.1,以便我可以使用可暂停功能。升级到3.18.1后,我收到错误FileNotes与类文件TimeoutAwareAggregationStategy.class. 当我打开camel-

  • 我一直在尝试为Spring引导Kafka骆驼Avro消费者寻找示例代码,但没有运气。我在以下URL找到了Spring Camel Kafka消费者和生产者示例: https://thysmichels.com/2015/09/04/apache-camel-kafka-spring-integration/ 我的具体问题是,一旦我的bean从Avro模式创建,并且我有了POJO类,我如何将上面的c

  • 我是第一次使用Camel。我的试验项目是编写一个应用程序,该应用程序接收HTTP GET请求(使用Jetty)并通过Thrift将请求传递到另一台服务器。然后将收到的答案传递回客户端。(即,如果您愿意,我正在编写超文本传输协议-get请求和Thrift支持的服务器之间的数据交换机或中间件应用程序。) 我有一个完美的非驼峰版本,现在我正在尝试将驼峰等效物组合在一起。目前,我只想将jetty请求写入一

  • 我正在使用Camel 2.10.3。 假设我有一条类似于以下内容的路线: 一个测试类在通知生成器之后执行该操作,以断言我的拆分器正在执行它应该执行的操作。 假设sampleEventsInArrayJsonString是一个json数组,如下所示: 其中,该json数组中有7个对象元素。 测试几乎会立即失败。但是,测试的输出清楚地显示了7条“已收到:{}”的日志消息。 现在,有趣的部分来了...如