0

我从 citrus 文档中获取并修改了这个示例,以创建一个测试前任务。

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 抛出一个 Exception 并表示它找不到 type 的 Bean javax.jms.Queue

没错,Qualifier 中的 bean id 是一个 Citrus JmsEndpoint,它是用

<citrus-jms:endpoint id="myCitrusJmsEndpointBeanId".../>

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

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

谢谢

4

1 回答 1

0

如果您不想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"));
  }
}

请参阅此处的文档,即带有Java DSL 运行器的部分。

编辑

这是@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));
    }
}
于 2018-01-04T18:27:02.737 回答