0

私のアプリケーションのワークフローは、メッセージ ヘッダーを追加し、別のヘッダーに応じてメッセージをルーティングし、メッセージをさらに下流に送信することです。このワークフローのテストは個別には成功しますが、一緒に実行すると失敗しますが、関連するすべてのオブジェクトをリセットしたようです。

春の統合ワークフロー:

<int:header-enricher input-channel="workflowStart" output-channel="headerEnriched">
    <int:header name="correlationId" expression="headers.id.toString()" />
</int:header-enricher>

<int:header-value-router input-channel="headerEnriched" header-name="messageType">
    <int:mapping value="stp" channel="stpChannel" />
    <int:mapping value="nonStp" channel="nonStpChannel" />
</int:header-value-router>

<int:publish-subscribe-channel id="nonStpChannel"   />
<int:publish-subscribe-channel id="stpChannel" apply-sequence="true"/>

<int:chain input-channel="nonStpChannel" output-channel="systemChannel1" id="nonStpChainBlockA"> 
    <!-- do something -->
</int:chain> 

<int:chain input-channel="stpChannel" output-channel="systemChannel3" id="stpChainBlockA"> 
    <!-- do something -->
</int:chain> 

Java テスト クラス:

@Autowired 
    private MessageChannel workflowStart;
    @Autowired
    private MessageHandler systemChannel1OutputHandler; 
    @Autowired
    private MessageHandler systemChannel3OutputHandler; 

    @Value("/xml/tradeStp.xml")
    private Resource stpMessageResource;
    private String stpMessage;
    @Value("/xml/tradeNonStp.xml")
    private Resource nonStpMessageResource;
    private String nonStpMessage;


    @Before
    public void setup() throws Exception {
        reset(systemChannel1OutputHandler);
        reset(systemChannel3OutputHandler);
        stpMessage = IOUtils.toString(stpMessageResource.getInputStream());
        nonStpMessage = IOUtils.toString(nonStpMessageResource.getInputStream());
    }

    @Test
    public void nonStpMessageWorkflow1Test() {
        Message<String> m = MessageBuilder
                .withPayload(nonStpMessage)
                .setHeaderIfAbsent("messageType", "nonStp")
                .build();       
        workflowStart.send(m);
        verify(systemChannel1OutputHandler, times(1)).handleMessage(any(Message.class));    
    }

    @Test
    public void stpMessageWorkflow2Test() {
        Message<String> m = MessageBuilder
                .withPayload(stpMessage)
                .setHeaderIfAbsent("messageType", "stp")
                .build();
        workflowStart.send(m);
        verify(systemChannel3OutputHandler, times(1)).handleMessage(any(Message.class));
    }

そしてテストコンテキスト:

<import resource="classpath:/spring/workflow.xml"/>

<int:outbound-channel-adapter channel="systemChannel1" ref="systemChannel1OutputHandler" method="handleMessage"/>
<bean id="systemChannel1OutputHandler" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.integration.core.MessageHandler"/>
</bean> 
<int:outbound-channel-adapter channel="systemChannel3" ref="systemChannel3OutputHandler" method="handleMessage"/>
<bean id="systemChannel3OutputHandler" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.integration.core.MessageHandler"/>
</bean>

<int:outbound-channel-adapter channel="headerEnriched" ref="headerEnricherOutputHandler" method="handleMessage"/>
<bean id="headerEnricherOutputHandler" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.integration.core.MessageHandler"/>
</bean>

両方のテストを一緒に実行すると、最初のテストは成功しますが、2 番目のテストは次のメッセージで失敗します。

    Wanted but not invoked:
messageHandler.handleMessage(<any>);
-> at com.company.integration.com.company.export.config.InterfaceTest.stpMessageWorkflow2Test(InterfaceTest.java:81)
Actually, there were zero interactions with this mock.

さまざまな方法でデバッグを試みました。問題は、header-value-router の直後、チェーンの前にあるようです。2 番目のテストの最後のデバッグ出力は、headerEnriched チャネルの「postSend」です。どんなアドバイスでも大歓迎です。

更新:別のテストのコンテキストにある追加の outputHandler を含めることができませんでした。これは現在含めています。headerEnricherOutputHandler を削除すると、すべてのテストが正常に実行されます。ただし、テストが一緒に実行されているときにこれが問題を引き起こす理由はまだわかりません。

4

2 に答える 2

0

any(class) を使用している Mockito で問題が発生しました。あなたが持っている場所

verify(systemChannel3OutputHandler, times(1)).handleMessage(any(Message.class));

次のように、クラスを削除すると機能しますか?

verify(systemChannel3OutputHandler, times(1)).handleMessage(any());
于 2012-11-13T15:52:16.307 に答える
0

私はあなたの問題を次のように再現することはできません.

<int:header-value-router input-channel="headerEnriched" header-name="messageType">
    <int:mapping value="stp" channel="stpChannel" />
    <int:mapping value="nonStp" channel="nonStpChannel" />
</int:header-value-router>

<int:publish-subscribe-channel id="nonStpChannel"   />
<int:publish-subscribe-channel id="stpChannel" apply-sequence="true"/>

<int:chain input-channel="stpChannel" output-channel="systemChannel1">
    <int:transformer expression="'bar'"/>
</int:chain>

<int:chain input-channel="nonStpChannel" output-channel="systemChannel3">
    <int:transformer expression="'bar'"/>
</int:chain>

<int:channel id="systemChannel1" />
<int:channel id="systemChannel3" />

<int:outbound-channel-adapter channel="systemChannel1" ref="systemChannel1OutputHandler" method="handleMessage"/>
<bean id="systemChannel1OutputHandler" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.integration.core.MessageHandler"/>
</bean> 
<int:outbound-channel-adapter channel="systemChannel3" ref="systemChannel3OutputHandler" method="handleMessage"/>
<bean id="systemChannel3OutputHandler" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.integration.core.MessageHandler"/>
</bean>

.

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Foo {

    @Autowired
    private MessageChannel headerEnriched;

    @Autowired
    private MessageHandler systemChannel1OutputHandler;

    @Autowired
    private MessageHandler systemChannel3OutputHandler;

    @Test
    public void test10() {
        Message<String> foo = MessageBuilder.withPayload("foo")
                .setHeader("messageType", "stp").build();
        headerEnriched.send(foo);
        verify(systemChannel1OutputHandler).handleMessage(any(Message.class));
    }

    @Test
    public void test30() {
        Message<String> foo = MessageBuilder.withPayload("foo")
                .setHeader("messageType", "nonStp").build();
        headerEnriched.send(foo);
        verify(systemChannel3OutputHandler).handleMessage(any(Message.class));
    }
}

どちらのテストも問題なく実行されます。

于 2012-11-14T05:14:39.300 に答える