[ http://jira.codehaus.org/browse/SUREFIRE-482?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=229294#action_229294 ]
Tom Eugelink commented on SUREFIRE-482: --------------------------------------- Oh my, that was easy. JUnit4DirectoryTestSuite has a method that actually creates the test runner and it is allowed to return null. So all that needs to be done is check for a method with the @Test annotation. If not found, return null. Here it is: protected SurefireTestSet createTestSet( Class testClass, ClassLoader classLoader ) throws TestSetFailedException { // this is JUnit4: check to see if there are any methods with a @Test annotations boolean lTestFound = false; for (Method lMethod : testClass.getDeclaredMethods()) { for (Annotation lAnnotation : lMethod.getAnnotations()) { if (org.junit.Test.class.isAssignableFrom( lAnnotation.annotationType() )) { lTestFound = true; break; } } } // if not test found, simply return null if (lTestFound == false) return null; // create the testset return new JUnit4TestSet( testClass ); } > Surefire tries to run JUnit4 tests that contain no @Test annotations > -------------------------------------------------------------------- > > Key: SUREFIRE-482 > URL: http://jira.codehaus.org/browse/SUREFIRE-482 > Project: Maven Surefire > Issue Type: Bug > Components: Junit 4.x support > Affects Versions: 2.4.2 > Reporter: Mark Hobson > Attachments: test.zip > > > Similar to SUREFIRE-346 but for JUnit4, Surefire tries to run classes that > contain no @Test annotations as tests, resulting in the exception: > java.lang.Exception: No runnable methods > at > org.junit.internal.runners.MethodValidator.validateInstanceMethods(MethodValidator.java:32) > at > org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.java:43) > at > org.junit.internal.runners.JUnit4ClassRunner.validate(JUnit4ClassRunner.java:36) > at > org.junit.internal.runners.JUnit4ClassRunner.<init>(JUnit4ClassRunner.java:27) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) > at java.lang.reflect.Constructor.newInstance(Constructor.java:494) > at > org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33) > at > org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28) > at > org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45) > at > org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56) > at > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96) > at > org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209) > at org.apache.maven.surefire.Surefire.run(Surefire.java:156) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) > at > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) > Such classes should be ignored by Surefire. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira