From 4eaf0d4a442e8070e09243f4d040f543b6dab964 Mon Sep 17 00:00:00 2001 From: Jon-Anders Teigen Date: Sat, 21 Jan 2012 12:23:54 +0100 Subject: [PATCH] #154, RunCukesTest.scala uses ScalaBackend.loadGlue which calls ClasspathResourceLoader().instantiateSubclasses which didn't check if the class had a valid constructor given the arguments. ScalaDslTest.scala holds multiple internal ScalaDsl instances which are compiled to classes implementing ScalaDsl but with no valid constructor. These were being picked up by the ClasspathResourceLoader causing the RunCukesTest to fail at load time --- .../main/java/cucumber/io/ClasspathResourceLoader.java | 2 +- core/src/main/java/cucumber/runtime/Utils.java | 9 +++++++++ pom.xml | 5 ++--- scala/pom.xml | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/cucumber/io/ClasspathResourceLoader.java b/core/src/main/java/cucumber/io/ClasspathResourceLoader.java index 163dc6927a..3819a73320 100644 --- a/core/src/main/java/cucumber/io/ClasspathResourceLoader.java +++ b/core/src/main/java/cucumber/io/ClasspathResourceLoader.java @@ -44,7 +44,7 @@ public T instantiateExactlyOneSubclass(Class parentType, String packagePa public Collection instantiateSubclasses(Class parentType, String packagePath, Class[] constructorParams, Object[] constructorArgs) { Collection result = new HashSet(); for (Class clazz : getDescendants(parentType, packagePath)) { - if (Utils.isInstantiable(clazz)) { + if (Utils.isInstantiable(clazz) && Utils.hasConstructor(clazz, constructorParams)) { result.add(newInstance(constructorParams, constructorArgs, clazz)); } } diff --git a/core/src/main/java/cucumber/runtime/Utils.java b/core/src/main/java/cucumber/runtime/Utils.java index 8a0ca7584b..7bfb0df16f 100644 --- a/core/src/main/java/cucumber/runtime/Utils.java +++ b/core/src/main/java/cucumber/runtime/Utils.java @@ -17,6 +17,15 @@ public static List listOf(int size, T obj) { public static boolean isInstantiable(Class clazz) { return Modifier.isPublic(clazz.getModifiers()) && !Modifier.isAbstract(clazz.getModifiers()); } + + public static boolean hasConstructor(Class clazz, Class[] paramTypes) { + try { + clazz.getConstructor(paramTypes); + return true; + } catch (NoSuchMethodException e) { + return false; + } + } public static String packagePath(Class clazz) { return packagePath(packageName(clazz.getName())); diff --git a/pom.xml b/pom.xml index 97b3f773f9..d4b18e74fe 100644 --- a/pom.xml +++ b/pom.xml @@ -60,12 +60,11 @@ cucumber-picocontainer ${project.version} - + info.cukes gherkin @@ -254,8 +253,8 @@ rhino java clojure + scala - diff --git a/scala/pom.xml b/scala/pom.xml index e9e674281e..00bfe84f83 100644 --- a/scala/pom.xml +++ b/scala/pom.xml @@ -8,7 +8,7 @@ info.cukes cucumber-jvm ../pom.xml - 1.0.0.RC7-SNAPSHOT + 1.0.0.RC11-SNAPSHOT cucumber-scala