Как писать отрицательные тестовые случаи в Munit

Я пишу отрицательный тестовый пример, в котором мне нужно создать исключение в потоке. Я хочу, чтобы глобальная стратегия исключения перехватила его, чтобы я мог утвердить ответ. Внутри GlobalExceptionStrategy мы устанавливаем некоторый код ошибки на основе кода ошибки исключения. Цель состоит в том, чтобы убедиться, что стратегия исключений работает.

Проблема в следующем. Я могу запустить поток с помощью runFlow(). этот метод вызовет исключение MuleException и никогда не вызовет стратегию исключений.

Есть ли способ передать это стратегии исключений, а затем получить от нее ответ...?


person Renjith    schedule 02.05.2016    source источник


Ответы (1)


Есть пара вещей, которым я не следую в вашем примере, поэтому я постараюсь сделать все возможное, делая предположения, и мы можем исходить из этого.

Во-первых, вам не следует проверять правильность работы стратегии исключений. То есть, если вы выдаете исключение, вам нужно предположить, что стратегия исключения (которая является компонентом Mule) работает должным образом, и она перехватит исключение. В противном случае вы закончите тестирование каждого компонента.

Более точным тестом было бы убедиться, что поток генерирует правильное исключение (что вы можете сделать с помощью MUnit).

Если вы хотите проверить, что логика внутри стратегии исключений работает правильно, я бы сказал, что она достаточно сложна, чтобы вы захотели ее протестировать, поэтому она должна быть как минимум в подпотоке. Таким образом вы можете убедиться, что подпоток работает правильно.

Теперь о том, что вы описали, если вы выполняете runFlow, а исключение не кэшируется, это связано с тем, что производственный код может иметь ошибку. Вы упоминаете глобальную стратегию исключений, поэтому, основываясь на этом, вот пример кода (как я думаю), ваш код должен выглядеть так:

 <configuration defaultExceptionStrategy-ref="zCatch_Exception_Strategy" doc:name="Configuration" />
    <flow name="zFlow">
        <scripting:component doc:name="Groovy">
            <scripting:script engine="Groovy"><![CDATA[throw new java.lang.RuntimeException()]]></scripting:script>
        </scripting:component>

    </flow>
    <catch-exception-strategy name="zCatch_Exception_Strategy">
        <logger message="+++ ERROR" level="INFO" doc:name="Logger"/>
        <set-variable variableName="error_var" value="#['value]" doc:name="Variable"/>
    </catch-exception-strategy>

Обратите внимание, что в дополнение к глобальной стратегии исключений вам также необходимо определить defaultExceptionStrategy.

<configuration defaultExceptionStrategy-ref="zCatch_Exception_Strategy" doc:name="Configuration" />

Это приведет к тому, что ваши исключения потока будут обрабатываться этим. Если вы этого не сделаете, стратегия исключений никогда не узнает, что было создано исключение.

Тем не менее, вот тестовый код:

  <munit:test name="z-test-suite-zFlowTest" description="Test">
        <flow-ref name="zFlow" doc:name="Flow-ref to zFlow"/>
        <munit:assert-on-equals message="oops" expectedValue="#['value']" actualValue="#[flowVars['error_var']]" doc:name="Assert Equals"/>
    </munit:test>

Теперь, когда вы сказали, что использовали runFlow, я считаю, что вы работаете с тестом на основе Java (хотя я бы посоветовал вам использовать подход к тестированию на основе XML), вот пример Java:

@Test
    public void theTest() throws MuleException, Exception {
        MuleEvent result = runFlow("zFlow", testEvent(""));

        String v = (String) result.getMessage().getProperty("error_var", PropertyScope.INVOCATION);
        Assert.assertEquals("value", v);
    }

ХТН

person Dds    schedule 03.05.2016
comment
Согласен.. Но здесь у меня нет возможности изменить код, чтобы он давал какие-то данные для Munit. Так это похоже на тупик, где я нахожусь? Ничего похожего на то, где мы можем поймать исключение из runFlow и передать его стратегии исключений, чтобы мы могли получить из нее результат? - person Renjith; 04.05.2016
comment
Нет, извините, нет - person Dds; 04.05.2016