You won't need a try/catch in your unit test, the runner.run(ONE)
should finish "successfully", then you can do the getLogger() and
check the message. If the error message is only logged if a
ProcessException is thrown (like with the suffix I see in your code),
then you should be able to check for its presence/absence.

On Thu, Aug 25, 2016 at 1:35 PM, Russell Bateman
<[email protected]> wrote:
> Yes, but as I never regain control after throwing ProcessorErrorin
> onTrigger(), I don't get a chance to look at the resulting log in my unit
> test. I must still be missing something here?
>
>
>
> On 08/25/2016 11:29 AM, Matt Burgess wrote:
>>
>> Russ,
>>
>> You can call runner.getLogger() which gives you a MockComponentLog:
>>
>> https://github.com/apache/nifi/blob/master/nifi-mock/src/main/java/org/apache/nifi/util/MockComponentLog.java.
>>  From that you can get your messages and check if you logged the
>> specific one(s) you care about.
>>
>> Regards,
>> Matt
>>
>> On Thu, Aug 25, 2016 at 1:22 PM, Russell Bateman
>> <[email protected]> wrote:
>>>
>>> Matt,
>>>
>>> Thank you for replying. It extends AbstractProcessor:
>>>
>>> public class X12MessageRouter extends AbstractProcessor
>>> {
>>>    @Override
>>>    public void onTrigger( final ProcessContext context, final
>>> ProcessSession
>>> session ) throws ProcessException
>>>    {
>>>      FlowFile flowfile = session.get();
>>>      ...
>>>
>>> No, you're right, I don't want to propagate exceptions outside the
>>> processor. I wasn't even thinking about that. I really just wanted to
>>> test
>>> that I'm throwing ProcessorException with the specific message for the
>>> specific reason I'm throwing it. Do you have a suggestion based on this?
>>>
>>> Thanks,
>>>
>>> Russ
>>>
>>>
>>> On 08/25/2016 11:12 AM, Matt Burgess wrote:
>>>>
>>>> Does your processor extend AbstractProcessor or
>>>> AbstractSessionFactoryProcessor? If the former, then all throwables
>>>> get caught by the onTrigger method:
>>>>
>>>>
>>>> https://github.com/apache/nifi/blob/master/nifi-api/src/main/java/org/apache/nifi/processor/AbstractProcessor.java
>>>>
>>>> Are you sure you want such exceptions to propagate out of the
>>>> processor? Usually you would route a flow file to some failure or
>>>> retry relationship, or rollback the session (which is what
>>>> AbstractProcessor does). This keeps the integrity of the framework
>>>> rather than an exception escaping into the wild.
>>>>
>>>> Regards,
>>>> Matt
>>>>
>>>> On Thu, Aug 25, 2016 at 12:51 PM, Russell Bateman
>>>> <[email protected]> wrote:
>>>>>
>>>>>   From my custom processor, I'm throwing a ProcessException that never
>>>>> reaches
>>>>> my catch in the JUnit test. I already have several other JUnit tests
>>>>> working
>>>>> on this processor; this is the remaining wiggle I want to test.
>>>>>
>>>>> I might be blind here, but I can't see what's wrong. Any comment will
>>>>> be
>>>>> useful.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Russ
>>>>>
>>>>> Here's the tail-end of my processor'sonTrigger() method:
>>>>>
>>>>>       ...
>>>>>
>>>>>       try
>>>>>       {
>>>>>         X12Simple x12 = ( X12Simple ) parser.parse( is.get() );
>>>>>         ...
>>>>>
>>>>>         session.transfer( newFlowfile, resultingRelationship );
>>>>>       }
>>>>>       catch( FormatException e ) *// this exception is caught--was
>>>>> thrown
>>>>> in
>>>>> X12 parser as expected!*
>>>>>       {
>>>>>         session.remove( newFlowfile );
>>>>> *      throw new ProcessException( e + " (the content is unparsable as
>>>>> an
>>>>> X12 message)" );*
>>>>>       }
>>>>>       catch( IOException e )
>>>>>       {
>>>>>         session.remove( newFlowfile );
>>>>>         throw new ProcessException( e );
>>>>>       }
>>>>>     }
>>>>>     finally
>>>>>     {
>>>>>       session.transfer( flowfile, ORIGINAL );
>>>>>     }
>>>>> }
>>>>>
>>>>>
>>>>> And here's the JUnit test case for now:
>>>>>
>>>>> @Test
>>>>> public void testOnTriggerCompleteCrap()
>>>>> {
>>>>>     TestRunner runner = TestRunners.newTestRunner( new
>>>>> X12MessageRouter()
>>>>> );
>>>>>
>>>>>     final int         ONE     = 1;
>>>>>     final InputStream MESSAGE = new ByteArrayInputStream(
>>>>> _CRAP.getBytes()
>>>>> );
>>>>>
>>>>>     Map< String, String > flowFileAttributes = new HashMap<>();
>>>>>     flowFileAttributes.put( "testname", "X12 Message Router Unit Test"
>>>>> );
>>>>>
>>>>>     runner.setValidateExpressionUsage( false );
>>>>>     runner.enqueue( MESSAGE, flowFileAttributes );
>>>>>
>>>>>     try
>>>>>     {
>>>>> *runner.run( ONE ); **// (exception will happen under here)*
>>>>>       runner.assertQueueEmpty();
>>>>>       List< MockFlowFile > results =
>>>>> runner.getFlowFilesForRelationship(
>>>>> X12MessageRouter.NONE );
>>>>>     }
>>>>>     catch( ProcessException e )
>>>>>     {
>>>>>       int x = 9; *// (never caught at breakpoint set here)*
>>>>>     }
>>>>> }
>>>>>
>

Reply via email to