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));
}
}
我从柑橘文档中提取并改编了这个例子来创建一个测试前任务。
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));
}
}