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  
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.DefaultDirectConsoleReporter;
30  import org.apache.maven.surefire.report.ReporterConfiguration;
31  import org.apache.maven.surefire.report.ReporterFactory;
32  import org.apache.maven.surefire.report.RunListener;
33  import org.apache.maven.surefire.suite.RunResult;
34  import org.apache.maven.surefire.testset.TestSetFailedException;
35  import org.apache.maven.surefire.util.TestsToRun;
36  
37  import org.junit.Rule;
38  import org.junit.Test;
39  import org.junit.rules.ExpectedException;
40  import org.junit.runner.Description;
41  import org.junit.runner.RunWith;
42  import org.junit.runner.notification.RunNotifier;
43  import org.junit.runners.BlockJUnit4ClassRunner;
44  import org.junit.runners.model.InitializationError;
45  
46  import static junit.framework.Assert.assertEquals;
47  
48  /**
49   * {@code
50   * <dependency>
51   * <groupId>junit</groupId>
52   * <artifactId>junit</artifactId>
53   * <version>4.8.1</version>
54   * <scope>test</scope>
55   * </dependency>
56   * <br>
57   * <dependency>
58   * <groupId>org.apache.maven.surefire</groupId>
59   * <artifactId>surefire-booter</artifactId>
60   * <version>2.8.1</version>
61   * <scope>test</scope>
62   * </dependency>
63   * <dependency>
64   * <groupId>org.apache.maven.plugins</groupId>
65   * <artifactId>maven-surefire-plugin</artifactId>
66   * <version>2.8.1</version>
67   * <scope>test</scope>
68   * </dependency>
69   * <dependency>
70   * <groupId>org.apache.maven.surefire</groupId>
71   * <artifactId>surefire-junit47</artifactId>
72   * <version>2.8.1</version>
73   * <scope>test</scope>
74   * </dependency>
75   * }
76   *
77   * @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
78   * @version $Revision: $
79   */
80  public class Surefire746Test
81  {
82      @Rule
83      public final ExpectedException exception = ExpectedException.none();
84  
85      @Test
86      public void surefireIsConfused_ByMultipleIgnore_OnClassLevel()
87          throws Exception
88      {
89          ReporterFactory reporterFactory = JUnitCoreTester.defaultNoXml();
90          BaseProviderFactory providerParameters = new BaseProviderFactory( reporterFactory, true );
91  
92          providerParameters.setReporterConfiguration( new ReporterConfiguration( new File( "" ), false ) );
93          Map<String, String> junitProps = new HashMap<String, String>();
94          junitProps.put( ProviderParameterNames.PARALLEL_PROP, "none" );
95  
96          JUnitCoreParameters jUnitCoreParameters = new JUnitCoreParameters( junitProps );
97  
98          final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
99  
100         RunListener listener =
101             ConcurrentRunListener.createInstance( testSetMap, reporterFactory, false, false,
102                                                         new DefaultDirectConsoleReporter( System.out ) );
103 
104         TestsToRun testsToRun = new TestsToRun( Collections.<Class<?>>singleton( TestClassTest.class ) );
105 
106         org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
107 
108         List<org.junit.runner.notification.RunListener> customRunListeners =
109             new ArrayList<org.junit.runner.notification.RunListener>();
110         customRunListeners.add( 0, jUnit4RunListener );
111 
112         try
113         {
114             // JUnitCoreWrapper#execute() is calling JUnit4RunListener#rethrowAnyTestMechanismFailures()
115             // and rethrows a failure which happened in listener
116             exception.expect( TestSetFailedException.class );
117             JUnit4RunListener dummy = new JUnit4RunListener( new MockReporter() );
118             new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters,
119                                         new DefaultDirectConsoleReporter( System.out ) )
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 }