在JMS队列中发送自定义对象的本机方式? (柑橘模拟器)

时间:2018-04-27 17:36:01

标签: testing integration-testing citrus-framework

我正在寻找一个本地(在框架方面是正确的)将第三方(自定义)对象发送到柑橘模拟器中的JMS的方法吗? 我试过了:

scenario
.send()
.payloadModel(myObject); 

但在JMS队列中,myObject显示为 com.consol.citrus.message.DefaultMessage 而不是 com ... myObject

示例: 场景 - 接收http POST请求(作为触发器)并将JMS对象发送到消息队列。

配置

...
.useObjectMessages(true)
...

方案

  ...
    import com.temafon.data.MORequest;

    @Scenario("morequest")
    @RequestMapping(value = "/simulator/morequest",method = RequestMethod.POST)

    public class JmsMoRequestScenario extends AbstractSimulatorScenario {

    @Override
    public void run(ScenarioDesigner scenario) {
       MORequest request = new MORequest(12345678901L, "USSD", "1172", "ON", 
       11L);
            request.setSourcePort(3);

        scenario
                .receive()
                .payload("getmorequest");

        scenario
                .send("jms.queue.destination")
                .payloadModel(request);

在这种情况下,我希望jms.queue.destination得到类似屏幕1的内容

Expectation

Reality

P.S。我已经在其他类中使用 JavaActionBuilder jmsTemplate.send 实现了解决方法,并且

scenario
.java(//Object).method(//instance");

但它似乎不是正确的柑橘模拟器方式

1 个答案:

答案 0 :(得分:0)

在Citrus Java DSL中设置payloadModel()总是会导致对象的某种编组表示,而这不是您想要的。都不使用.useObjectMessages(true)为您工作,因为这会导致整个Citrus消息对象用作消息有效负载。

您需要定义一个完整的Citrus消息对象,就为JMS目标创建有效负载而言,它将保持不变。然后,Citrus将自动使用具有适当对象有效负载的JMS对象消息。

MORequest request = new MORequest(12345678901L, "USSD", "1172", "ON", 11L);
request.setSourcePort(3);

scenario
    .receive()
    .payload("getmorequest");

scenario
    .send("jms.queue.destination")
    .message(new JmsMessage(request));

请注意,我使用的是.message()流利的API,而不是payloadModel() API。消息API接收Citrus消息对象,例如com.consol.citrus.jms.message.JmsMessagecom.consol.citrus.message.DefaultMessage

您的自定义域模型对象request用作构造函数arg,并将按原样产生JMS消息作为对象有效负载。当然,MORequest的类型必须为java.io.Serializable