JBoss.org Community Documentation
The sequencing framework was designed to make testing sequencers much easier. In particular, the
StreamSequencer
interface does not make use of the JCR API. So instead of requiring a fully-configured
JCR repository and JBoss DNA system, unit tests for a sequencer can focus on testing that the content is
processed correctly and the desired output graph is generated.
For a complete example of a sequencer unit test, see the ImageMetadataSequencerTest
unit test
in the org.jboss.dna.sequencer.images
package of the dna-sequencers-image
project.
The following code fragment shows one way of testing a sequencer, using JUnit 4.4 assertions and some of the classes made available by JBoss DNA. Of course, this example code does not do any error handling and does not make all the assertions a real test would.
Sequencer sequencer = new ImageMetadataSequencer(); MockSequencerOutput output = new MockSequencerOutput(); ProgressMonitor progress = new SimpleProgressMonitor("Test activity"); InputStream stream = null; try { stream = this.getClass().getClassLoader().getResource("caution.gif").openStream(); sequencer.sequence(stream,output,progress); // writes to 'output' assertThat(output.getPropertyValues("image:metadata", "jcr:primaryType"), is(new Object[] {"image:metadata"})); assertThat(output.getPropertyValues("image:metadata", "jcr:mimeType"), is(new Object[] {"image/gif"})); // ... make more assertions here assertThat(output.hasReferences(), is(false)); } finally { stream.close(); }
It's also useful to test that a sequencer produces no output for something it should not understand:
Sequencer sequencer = new ImageMetadataSequencer(); MockSequencerOutput output = new MockSequencerOutput(); ProgressMonitor progress = new SimpleProgressMonitor("Test activity"); InputStream stream = null; try { stream = this.getClass().getClassLoader().getResource("caution.pict").openStream(); sequencer.sequence(stream,output,progress); // writes to 'output' assertThat(output.hasProperties(), is(false)); assertThat(output.hasReferences(), is(false)); } finally { stream.close(); }
These are just two simple tests that show ways of testing a sequencer. Some tests may get quite involved, especially if a lot of output data are produced.
It may also be useful to create some integration tests
that configures JBoss DNA to use the custom sequencer, and to then upload
content using the JCR API, verifying that the custom sequencer did run. However, remember that JBoss DNA
runs sequencers asynchronously in the background, and you must sychronize your tests to ensure that the
sequencers have a chance to run before checking the results. (One way of doing this is to wait for a second
after uploading your content, shutdown the SequencingService
and await its termination,
and then check that the sequencer output has been saved to the JCR repository. For an example of this technique,
see the SequencingClientTest
unit test in the example application.)