2016-05-02 4 views
1

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

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

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

ответ

0

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

Во-первых, вы не должны проверять правильность работы стратегии исключения. То есть, если вы вычеркнете исключение, вам нужно предположить, что стратегия исключения (которая является компонентом 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); 
    } 

НТН

+0

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

+0

Нет, извините, нет – Dds

+0

oops !!. это очень грустно – Renjith

Смежные вопросы