001 package org.junit.runner.notification; 002 003 import java.lang.annotation.Documented; 004 import java.lang.annotation.ElementType; 005 import java.lang.annotation.Retention; 006 import java.lang.annotation.RetentionPolicy; 007 import java.lang.annotation.Target; 008 009 import org.junit.runner.Description; 010 import org.junit.runner.Result; 011 012 /** 013 * Register an instance of this class with {@link RunNotifier} to be notified 014 * of events that occur during a test run. All of the methods in this class 015 * are abstract and have no implementation; override one or more methods to 016 * receive events. 017 * <p> 018 * For example, suppose you have a <code>Cowbell</code> 019 * class that you want to make a noise whenever a test fails. You could write: 020 * <pre> 021 * public class RingingListener extends RunListener { 022 * public void testFailure(Failure failure) { 023 * Cowbell.ring(); 024 * } 025 * } 026 * </pre> 027 * <p> 028 * To invoke your listener, you need to run your tests through <code>JUnitCore</code>. 029 * <pre> 030 * public void main(String... args) { 031 * JUnitCore core= new JUnitCore(); 032 * core.addListener(new RingingListener()); 033 * core.run(MyTestClass.class); 034 * } 035 * </pre> 036 * <p> 037 * If a listener throws an exception for a test event, the other listeners will 038 * have their {@link RunListener#testFailure(Failure)} called with a {@code Description} 039 * of {@link Description#TEST_MECHANISM} to indicate the failure. 040 * <p> 041 * By default, JUnit will synchronize calls to your listener. If your listener 042 * is thread-safe and you want to allow JUnit to call your listener from 043 * multiple threads when tests are run in parallel, you can annotate your 044 * test class with {@link RunListener.ThreadSafe}. 045 * <p> 046 * Listener methods will be called from the same thread as is running 047 * the test, unless otherwise indicated by the method Javadoc 048 * 049 * @see org.junit.runner.JUnitCore 050 * @since 4.0 051 */ 052 public class RunListener { 053 054 /** 055 * Called before any tests have been run. This may be called on an 056 * arbitrary thread. 057 * 058 * @param description describes the tests to be run 059 */ 060 public void testRunStarted(Description description) throws Exception { 061 } 062 063 /** 064 * Called when all tests have finished. This may be called on an 065 * arbitrary thread. 066 * 067 * @param result the summary of the test run, including all the tests that failed 068 */ 069 public void testRunFinished(Result result) throws Exception { 070 } 071 072 /** 073 * Called when an atomic test is about to be started. 074 * 075 * @param description the description of the test that is about to be run 076 * (generally a class and method name) 077 */ 078 public void testStarted(Description description) throws Exception { 079 } 080 081 /** 082 * Called when an atomic test has finished, whether the test succeeds or fails. 083 * 084 * @param description the description of the test that just ran 085 */ 086 public void testFinished(Description description) throws Exception { 087 } 088 089 /** 090 * Called when an atomic test fails, or when a listener throws an exception. 091 * 092 * <p>In the case of a failure of an atomic test, this method will be called 093 * with the same {@code Description} passed to 094 * {@link #testStarted(Description)}, from the same thread that called 095 * {@link #testStarted(Description)}. 096 * 097 * <p>In the case of a listener throwing an exception, this will be called with 098 * a {@code Description} of {@link Description#TEST_MECHANISM}, and may be called 099 * on an arbitrary thread. 100 * 101 * @param failure describes the test that failed and the exception that was thrown 102 */ 103 public void testFailure(Failure failure) throws Exception { 104 } 105 106 /** 107 * Called when an atomic test flags that it assumes a condition that is 108 * false 109 * 110 * @param failure describes the test that failed and the 111 * {@link org.junit.AssumptionViolatedException} that was thrown 112 */ 113 public void testAssumptionFailure(Failure failure) { 114 } 115 116 /** 117 * Called when a test will not be run, generally because a test method is annotated 118 * with {@link org.junit.Ignore}. 119 * 120 * @param description describes the test that will not be run 121 */ 122 public void testIgnored(Description description) throws Exception { 123 } 124 125 126 /** 127 * Indicates a {@code RunListener} that can have its methods called 128 * concurrently. This implies that the class is thread-safe (i.e. no set of 129 * listener calls can put the listener into an invalid state, even if those 130 * listener calls are being made by multiple threads without 131 * synchronization). 132 * 133 * @since 4.12 134 */ 135 @Documented 136 @Target(ElementType.TYPE) 137 @Retention(RetentionPolicy.RUNTIME) 138 public @interface ThreadSafe { 139 } 140 }