forked from phoedos/pmd
PMDTestRunner should not fail, if there are no unit tests
This commit is contained in:
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
package net.sourceforge.pmd.testframework;
|
package net.sourceforge.pmd.testframework;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.junit.runner.Description;
|
import org.junit.runner.Description;
|
||||||
import org.junit.runner.Runner;
|
import org.junit.runner.Runner;
|
||||||
import org.junit.runner.manipulation.Filter;
|
import org.junit.runner.manipulation.Filter;
|
||||||
@@ -21,8 +24,8 @@ import org.junit.runners.model.InitializationError;
|
|||||||
* and our custom {@link RuleTestRunner}.
|
* and our custom {@link RuleTestRunner}.
|
||||||
* It allows to selectively execute single test cases (it is {@link Filterable}).
|
* It allows to selectively execute single test cases (it is {@link Filterable}).
|
||||||
*
|
*
|
||||||
* <p>Note: Since we actually run two runner one after another, the static {@code BeforeClass}
|
* <p>Note: Since we actually run two runners one after another, the static {@code BeforeClass}
|
||||||
* and {@Code AfterClass} methods will be executed twice.</p>
|
* and {@Code AfterClass} methods will be executed twice and the test class will be instantiated twice, too.</p>
|
||||||
*
|
*
|
||||||
* <p>In order to use it, you'll need to subclass {@link SimpleAggregatorTst} and
|
* <p>In order to use it, you'll need to subclass {@link SimpleAggregatorTst} and
|
||||||
* annotate your test class with RunWith:</p>
|
* annotate your test class with RunWith:</p>
|
||||||
@@ -37,12 +40,17 @@ import org.junit.runners.model.InitializationError;
|
|||||||
public class PMDTestRunner extends Runner implements Filterable, Sortable {
|
public class PMDTestRunner extends Runner implements Filterable, Sortable {
|
||||||
private final Class<? extends SimpleAggregatorTst> klass;
|
private final Class<? extends SimpleAggregatorTst> klass;
|
||||||
private final RuleTestRunner ruleTests;
|
private final RuleTestRunner ruleTests;
|
||||||
private final JUnit4 unitTests;
|
private final ParentRunner<?> unitTests;
|
||||||
|
|
||||||
public PMDTestRunner(final Class<? extends SimpleAggregatorTst> klass) throws InitializationError {
|
public PMDTestRunner(final Class<? extends SimpleAggregatorTst> klass) throws InitializationError {
|
||||||
this.klass = klass;
|
this.klass = klass;
|
||||||
ruleTests = new RuleTestRunner(klass);
|
ruleTests = new RuleTestRunner(klass);
|
||||||
unitTests = new JUnit4(klass);
|
|
||||||
|
if (ruleTests.hasUnitTests()) {
|
||||||
|
unitTests = new JUnit4(klass);
|
||||||
|
} else {
|
||||||
|
unitTests = new EmptyRunner(klass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -74,7 +82,7 @@ public class PMDTestRunner extends Runner implements Filterable, Sortable {
|
|||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Description createChildrenDescriptions(ParentRunner<?> runner, String suiteName) {
|
private Description createChildrenDescriptions(Runner runner, String suiteName) {
|
||||||
Description suite = Description.createSuiteDescription(suiteName);
|
Description suite = Description.createSuiteDescription(suiteName);
|
||||||
for (Description child : runner.getDescription().getChildren()) {
|
for (Description child : runner.getDescription().getChildren()) {
|
||||||
suite.addChild(child);
|
suite.addChild(child);
|
||||||
@@ -93,4 +101,30 @@ public class PMDTestRunner extends Runner implements Filterable, Sortable {
|
|||||||
ruleTests.sort(sorter);
|
ruleTests.sort(sorter);
|
||||||
unitTests.sort(sorter);
|
unitTests.sort(sorter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class EmptyRunner extends ParentRunner<Object> {
|
||||||
|
protected EmptyRunner(Class<?> testClass) throws InitializationError {
|
||||||
|
super(testClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Description getDescription() {
|
||||||
|
return Description.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Object> getChildren() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Description describeChild(Object child) {
|
||||||
|
return Description.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void runChild(Object child, RunNotifier notifier) {
|
||||||
|
// there are no tests - nothing to execute
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
import org.junit.internal.runners.statements.RunAfters;
|
import org.junit.internal.runners.statements.RunAfters;
|
||||||
import org.junit.internal.runners.statements.RunBefores;
|
import org.junit.internal.runners.statements.RunBefores;
|
||||||
import org.junit.rules.RunRules;
|
import org.junit.rules.RunRules;
|
||||||
@@ -54,6 +55,14 @@ public class RuleTestRunner extends ParentRunner<TestDescriptor> {
|
|||||||
return description;
|
return description;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether this test class has additionally unit test methods.
|
||||||
|
* @return true if there is at least one unit test method.
|
||||||
|
*/
|
||||||
|
public boolean hasUnitTests() {
|
||||||
|
return !getTestClass().getAnnotatedMethods(Test.class).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<TestDescriptor> getChildren() {
|
protected List<TestDescriptor> getChildren() {
|
||||||
List<Rule> rules = new ArrayList<>(instance.getRules());
|
List<Rule> rules = new ArrayList<>(instance.getRules());
|
||||||
|
Reference in New Issue
Block a user