Fix spring test to properly handle failures

Failing test cases weren't not properly handled and instead caused
test to break. Added a test case and verified it works for both JUnit
and Spock.
This commit is contained in:
Greg Turnquist
2013-10-10 13:18:23 -05:00
committed by Andy Wilkinson
parent 7e7d4b7d3d
commit cc92ba1a5c
8 changed files with 143 additions and 109 deletions

View File

@@ -88,7 +88,6 @@ public class TestCommand extends OptionParsingCommand {
private static class TestOptionHandler extends OptionHandler {
private final GroovyCompiler compiler;
private TestResults results;
public TestOptionHandler() {
@@ -113,11 +112,12 @@ public class TestCommand extends OptionParsingCommand {
* against the composite AST.
*/
// Compile - Pass 1 - collect testers
// Compile - Pass 1 - compile source code to see what test libraries were
// pulled in
Object[] sources = this.compiler.sources(fileOptions.getFilesArray());
Set<File> testerFiles = compileAndCollectTesterFiles(sources);
List<File> testerFiles = compileAndCollectTesterFiles(sources);
// Compile - Pass 2 - with appropriate testers added in
// Compile - Pass 2 - add appropriate testers
List<File> files = new ArrayList<File>(fileOptions.getFiles());
files.addAll(testerFiles);
sources = this.compiler.sources(files.toArray(new File[files.size()]));
@@ -145,14 +145,17 @@ public class TestCommand extends OptionParsingCommand {
GroovyObject obj = (GroovyObject) tester.newInstance();
this.results.add((TestResults) obj.invokeMethod("findAndTest", compiled));
}
printReport(this.results);
}
private Set<File> compileAndCollectTesterFiles(Object[] sources)
private List<File> compileAndCollectTesterFiles(Object[] sources)
throws CompilationFailedException, IOException {
Set<File> testerFiles = new LinkedHashSet<File>();
addTesterOnClass(sources, "org.junit.Test", "junit", testerFiles);
addTesterOnClass(sources, "spock.lang.Specification", "spock", testerFiles);
Set<String> testerUnits = new LinkedHashSet<String>();
List<File> testerFiles = new ArrayList<File>();
addTesterOnClass(sources, "org.junit.Test", testerFiles, testerUnits, "junit");
addTesterOnClass(sources, "spock.lang.Specification", testerFiles,
testerUnits, "junit", "spock");
if (!testerFiles.isEmpty()) {
testerFiles.add(createTempTesterFile("tester"));
}
@@ -161,12 +164,16 @@ public class TestCommand extends OptionParsingCommand {
}
private void addTesterOnClass(Object[] sources, String className,
String testerName, Set<File> testerFiles) {
List<File> testerFiles, Set<String> testerUnits, String... testerNames) {
for (Object source : sources) {
if (source instanceof Class<?>) {
try {
((Class<?>) source).getClassLoader().loadClass(className);
testerFiles.add(createTempTesterFile(testerName));
for (String testerName : testerNames) {
if (testerUnits.add(testerName)) {
testerFiles.add(createTempTesterFile(testerName));
}
}
return;
}
catch (ClassNotFoundException ex) {
@@ -201,7 +208,7 @@ public class TestCommand extends OptionParsingCommand {
String trailer = "";
String trace = "";
for (Failure failure : results.getFailures()) {
trailer += failure.getDescription().toString();
trailer += "Failed: " + failure.getDescription().toString() + "\n";
trace += failure.getTrace() + "\n";
}

View File

@@ -16,7 +16,7 @@
package org.springframework.boot.cli.command.tester;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
/**
@@ -42,8 +42,8 @@ public class TestResults {
}
@Override
public Failure[] getFailures() {
return new Failure[0];
public List<Failure> getFailures() {
return new ArrayList<Failure>();
}
@Override
@@ -52,23 +52,16 @@ public class TestResults {
}
};
private int runCount;
private int failureCount;
private Failure[] failures = new Failure[0];
private int runCount = 0;
private List<Failure> failures = new ArrayList<Failure>();
public void add(TestResults results) {
this.runCount += results.getRunCount();
this.failureCount += results.getFailureCount();
List<Failure> failures = Arrays.asList(this.failures);
failures.addAll(Arrays.asList(results.getFailures()));
this.failures = failures.toArray(new Failure[] {});
this.failures.addAll(results.getFailures());
}
public boolean wasSuccessful() {
return this.failureCount == 0;
return this.failures.size() == 0;
}
public int getRunCount() {
@@ -80,18 +73,14 @@ public class TestResults {
}
public int getFailureCount() {
return this.failureCount;
return this.failures.size();
}
public void setFailureCount(int failureCount) {
this.failureCount = failureCount;
}
public Failure[] getFailures() {
public List<Failure> getFailures() {
return this.failures;
}
public void setFailures(Failure[] failures) {
public void setFailures(List<Failure> failures) {
this.failures = failures;
}

View File

@@ -38,12 +38,16 @@ public class SpockCompilerAutoConfiguration extends CompilerAutoConfiguration {
@Override
public void applyDependencies(DependencyCustomizer dependencies)
throws CompilationFailedException {
dependencies.add("spock-core");
dependencies.add("spock-core").add("junit").add("spring-test")
.add("hamcrest-library");
}
@Override
public void applyImports(ImportCustomizer imports) throws CompilationFailedException {
imports.addStarImports("spock.lang");
imports.addStarImports("spock.lang").addStarImports("org.junit")
.addStaticStars("org.junit.Assert")
.addStaticStars("org.hamcrest.MatcherAssert")
.addStaticStars("org.hamcrest.Matchers");
}
}