Listeners, in general, helps in listening the events on which we are interested. This might be for several reasons. For example, we add listeners to add specific logs, handle UI events in Java GUI programming etc.
JUnit also provide support for adding listeners while executing the tests via RunListener class. This listener can be used for various purposes from improved logging to test specific logic.
1. JUnit RunListener Example
1.1. JUnit test classes
We are writing two test classes below for example only. We will monitor the logs printed for tests written in these classes.
package com.howtodoinjava.junit; import junit.framework.Assert; import org.junit.Test; public class TestFeatureOne { @Test public void testFirstFeature() { Assert.assertTrue(true); } }
package com.howtodoinjava.junit; import junit.framework.Assert; import org.junit.Ignore; import org.junit.Test; public class TestFeatureTwo { @Test public void testSecondFeature() { Assert.assertTrue(true); } @Test @Ignore public void testSecondFeatureIngored() { Assert.assertTrue(true); } }
1.2. JUnit test listener
Lets write run listener. This listener will extend the RunListener class provided by JUnit.
We are free to override any number of methods
RunListener
class from including no method at all.
package com.howtodoinjava.junit.suite; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class ExecutionListener extends RunListener { /** * Called before any tests have been run. * */ public void testRunStarted(Description description) throws java.lang.Exception { System.out.println("Number of tests to execute : " + description.testCount()); } /** * Called when all tests have finished * */ public void testRunFinished(Result result) throws java.lang.Exception { System.out.println("Number of tests executed : " + result.getRunCount()); } /** * Called when an atomic test is about to be started. * */ public void testStarted(Description description) throws java.lang.Exception { System.out.println("Starting execution of test case : "+ description.getMethodName()); } /** * Called when an atomic test has finished, whether the test succeeds or fails. * */ public void testFinished(Description description) throws java.lang.Exception { System.out.println("Finished execution of test case : "+ description.getMethodName()); } /** * Called when an atomic test fails. * */ public void testFailure(Failure failure) throws java.lang.Exception { System.out.println("Execution of test case failed : "+ failure.getMessage()); } /** * Called when a test will not be run, generally because a test method is annotated with Ignore. * */ public void testIgnored(Description description) throws java.lang.Exception { System.out.println("Execution of test case ignored : "+ description.getMethodName()); } }
2. JUnit Listener Execution
Now, lets run the tests and observe the listener output.
package com.howtodoinjava.junit.suite; import org.junit.runner.JUnitCore; import com.howtodoinjava.junit.TestFeatureOne; import com.howtodoinjava.junit.TestFeatureTwo; public class ExecuteWithRunListener { public static void main(String[] args) { JUnitCore runner = new JUnitCore(); <strong>//Adding listener here</strong> runner.addListener(new ExecutionListener()); runner.run(TestFeatureOne.class, TestFeatureTwo.class); } }
Program Output.
Number of tests to execute : 3 Starting execution of test case : testFirstFeature Finished execution of test case : testFirstFeature Starting execution of test case : testSecondFeature Finished execution of test case : testSecondFeature Execution of test case ignored : testSecondFeatureIngored Number of tests executed : 2
Clearly, adding listener provide extra control on test execution with improved logging support.
Happy Learning !!
Comments