Citrus 框架:BeforeTest 实现中的类型混淆

Citrus framework: Type confusion in BeforeTest implementation

我从柑橘文档中提取并改编了这个例子来创建一个测试前任务。

public class BeforeTest extends TestRunnerBeforeTestSupport {
    @Autowired
    @Qualifier("myCitrusJmsEndpointBeanId")
    private javax.jms.Queue injectedQueue;

    @Override
    public void beforeTest(TestRunner runner) {
        runner.purgeQueues(action -> action.queue(injectedQueue));
    }
}

当我开始测试时,Spring 抛出异常并抱怨找不到类型为 javax.jms.Queue 的 Bean。

没错,Qualifier 中的 bean id 是使用

创建的 Citrus JmsEndpoint
<citrus-jms:endpoint id="myCitrusJmsEndpointBeanId".../>

但是将 JmsEndpoint bean 重新定义为 Queue bean 是多余的。另一方面不允许编译器将 injectedQueue 定义为 JmsEndpoint.

显然我在这里做错了。柑橘样品中有完整的例子吗?还是其他地方?

谢谢

如果您不想在配置中将任何 Queues 定义为 Bean,您可以这样做。

public class PurgeQueuesBeforeSuite extends TestRunnerBeforeSuiteSupport {

@Autowired
@Qualifier("connectionFactory")
ConnectionFactory queueConnectionFactory;

@Override
public void beforeSuite(TestRunner runner) {
    runner.purgeQueues(action ->
    action.connectionFactory(queueConnectionFactory)
            .queue("QUEUE_NAME_1")
    .queue("QUEUE_NAME_2")
    .queue("QUEUE_NAME_3"));
  }
}

参见文档 here,带有 Java DSL runner 的部分。

编辑

下面是@burki使用的解决方案的详细说明。

将队列名称配置为 citrus.properties 文件中的属性:

my.out.queue.name=MY_OUT_QUEUE
my.in.queue.name=MY_IN_QUEUE

然后您可以像这样在 citrus-context.xml 中使用它们:

<citrus-jms:endpoint id="myOutQueueEndpoint"
                     destination-name="${my.out.queue.name}"
                     timeout="10000"/>

并且在 PurgeQueuesBeforeSuite 操作中是这样的:

public class PurgeQueuesBeforeSuite extends TestRunnerBeforeSuiteSupport {

    @Autowired
    @Qualifier("connectionFactory")
    ConnectionFactory queueConnectionFactory;

    @Value("${my.out.queue.name}")
    private String myOutQueueName;

    @Override
    public void beforeSuite(TestRunner runner) {
        runner.purgeQueues(action ->
        action.connectionFactory(queueConnectionFactory)
                .queue(myOutQueueName));
    }
}