View Javadoc
1   package org.apache.maven.surefire.junitcore;
2   
3   /*
4    * JBoss, Home of Professional Open Source
5    * Copyright 2009, Red Hat Middleware LLC, and individual contributors
6    * by the @authors tag. See the copyright.txt in the distribution for a
7    * full listing of individual contributors.
8    *
9    * Licensed under the Apache License, Version 2.0 (the "License");
10   * you may not use this file except in compliance with the License.
11   * You may obtain a copy of the License at
12   * http://www.apache.org/licenses/LICENSE-2.0
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */
19  
20  import java.io.File;
21  import java.util.*;
22  import java.util.concurrent.ConcurrentHashMap;
23  import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
24  import org.apache.maven.surefire.booter.BaseProviderFactory;
25  import org.apache.maven.surefire.booter.ProviderParameterNames;
26  import org.apache.maven.surefire.common.junit4.JUnit4RunListener;
27  import org.apache.maven.surefire.common.junit4.Notifier;
28  import org.apache.maven.surefire.junit4.MockReporter;
29  import org.apache.maven.surefire.report.ConsoleLogger;
30  import org.apache.maven.surefire.report.DefaultConsoleReporter;
31  import org.apache.maven.surefire.report.ReporterConfiguration;
32  import org.apache.maven.surefire.report.ReporterFactory;
33  import org.apache.maven.surefire.report.RunListener;
34  import org.apache.maven.surefire.suite.RunResult;
35  import org.apache.maven.surefire.testset.TestSetFailedException;
36  import org.apache.maven.surefire.util.TestsToRun;
37  
38  import org.junit.Rule;
39  import org.junit.Test;
40  import org.junit.rules.ExpectedException;
41  import org.junit.runner.Description;
42  import org.junit.runner.RunWith;
43  import org.junit.runner.notification.RunNotifier;
44  import org.junit.runners.BlockJUnit4ClassRunner;
45  import org.junit.runners.model.InitializationError;
46  
47  import static junit.framework.Assert.assertEquals;
48  
49  /**
50   * {@code
51   * <dependency>
52   * <groupId>junit</groupId>
53   * <artifactId>junit</artifactId>
54   * <version>4.8.1</version>
55   * <scope>test</scope>
56   * </dependency>
57   * <p/>
58   * <dependency>
59   * <groupId>org.apache.maven.surefire</groupId>
60   * <artifactId>surefire-booter</artifactId>
61   * <version>2.8.1</version>
62   * <scope>test</scope>
63   * </dependency>
64   * <dependency>
65   * <groupId>org.apache.maven.plugins</groupId>
66   * <artifactId>maven-surefire-plugin</artifactId>
67   * <version>2.8.1</version>
68   * <scope>test</scope>
69   * </dependency>
70   * <dependency>
71   * <groupId>org.apache.maven.surefire</groupId>
72   * <artifactId>surefire-junit47</artifactId>
73   * <version>2.8.1</version>
74   * <scope>test</scope>
75   * </dependency>
76   * }
77   *
78   * @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
79   * @version $Revision: $
80   */
81  public class Surefire746Test
82  {
83      @Rule
84      public final ExpectedException exception = ExpectedException.none();
85  
86      @Test
87      public void surefireIsConfused_ByMultipleIgnore_OnClassLevel()
88          throws Exception
89      {
90          ReporterFactory reporterFactory = DefaultReporterFactory.defaultNoXml();
91          BaseProviderFactory providerParameters = new BaseProviderFactory( reporterFactory, true );
92          ConsoleLogger consoleLogger = new DefaultConsoleReporter( System.out );
93  
94          providerParameters.setReporterConfiguration( new ReporterConfiguration( new File( "" ), false ) );
95          Map<String, String> junitProps = new HashMap<String, String>();
96          junitProps.put( ProviderParameterNames.PARALLEL_PROP, "none" );
97  
98          JUnitCoreParameters jUnitCoreParameters = new JUnitCoreParameters( junitProps );
99  
100         final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
101 
102         RunListener listener =
103             ConcurrentRunListener.createInstance( testSetMap, reporterFactory, false, false, consoleLogger );
104 
105         TestsToRun testsToRun = new TestsToRun( Collections.<Class<?>>singleton( TestClassTest.class ) );
106 
107         org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
108 
109         List<org.junit.runner.notification.RunListener> customRunListeners =
110             new ArrayList<org.junit.runner.notification.RunListener>();
111         customRunListeners.add( 0, jUnit4RunListener );
112 
113         try
114         {
115             // JUnitCoreWrapper#execute() is calling JUnit4RunListener#rethrowAnyTestMechanismFailures()
116             // and rethrows a failure which happened in listener
117             exception.expect( TestSetFailedException.class );
118             JUnit4RunListener dummy = new JUnit4RunListener( new MockReporter() );
119             new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters, new Logger() )
120                 .execute( testsToRun, customRunListeners, null );
121         }
122         finally
123         {
124             RunResult result = reporterFactory.close();
125             assertEquals( "JUnit should report correctly number of test ran(Finished)", 1, result.getCompletedCount() );
126         }
127     }
128 
129     @RunWith( TestCaseRunner.class )
130     public static class TestClassTest
131     {
132         @Test
133         public void shouldNeverBeCalled()
134             throws Exception
135         {
136         }
137     }
138 
139     public static class TestCaseRunner
140         extends BlockJUnit4ClassRunner
141     {
142         public TestCaseRunner( Class<?> klass )
143             throws InitializationError
144         {
145             super( klass );
146         }
147 
148         @Override
149         public void run( RunNotifier notifier )
150         {
151             notifier.addListener( new TestRunListener() );
152             super.run( notifier );
153         }
154 
155     }
156 
157     private static class TestRunListener
158         extends org.junit.runner.notification.RunListener
159     {
160         @Override
161         public void testFinished( Description description )
162             throws Exception
163         {
164             throw new RuntimeException(
165                 "This Exception will cause Surefire to receive an internal JUnit Description and fail." );
166         }
167     }
168 }