diff --git a/src/main/java/org/testng/TestRunner.java b/src/main/java/org/testng/TestRunner.java
index 862b343086..f032000243 100644
--- a/src/main/java/org/testng/TestRunner.java
+++ b/src/main/java/org/testng/TestRunner.java
@@ -331,6 +331,12 @@ private void initListeners() {
addTestListener((ITestListener) listener);
} else if (listener instanceof IReporter) {
m_suite.addListener((ITestNGListener) listener);
+ } else if (listener instanceof IConfigurable) {
+ m_configuration.setConfigurable((IConfigurable) listener);
+ } else if (listener instanceof IHookable) {
+ m_configuration.setHookable((IHookable) listener);
+ } else {
+ throw new TestNGException("Unknown listener type: " + listener);
}
}
}
diff --git a/src/main/java/org/testng/internal/Configuration.java b/src/main/java/org/testng/internal/Configuration.java
index 7753039aa7..6117c937ce 100644
--- a/src/main/java/org/testng/internal/Configuration.java
+++ b/src/main/java/org/testng/internal/Configuration.java
@@ -39,8 +39,18 @@ public IHookable getHookable() {
return m_hookable;
}
+ @Override
+ public void setHookable(IHookable h) {
+ m_hookable = h;
+ }
+
@Override
public IConfigurable getConfigurable() {
return m_configurable;
}
+
+ @Override
+ public void setConfigurable(IConfigurable c) {
+ m_configurable = c;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/org/testng/internal/IConfiguration.java b/src/main/java/org/testng/internal/IConfiguration.java
index 99f4078693..b5ac50cb40 100644
--- a/src/main/java/org/testng/internal/IConfiguration.java
+++ b/src/main/java/org/testng/internal/IConfiguration.java
@@ -11,6 +11,8 @@ public interface IConfiguration {
IObjectFactory getObjectFactory();
IHookable getHookable();
+ void setHookable(IHookable h);
IConfigurable getConfigurable();
+ void setConfigurable(IConfigurable c);
}
diff --git a/src/main/java/org/testng/internal/MethodHelper.java b/src/main/java/org/testng/internal/MethodHelper.java
index 79c9b64b01..8e5e6713fc 100644
--- a/src/main/java/org/testng/internal/MethodHelper.java
+++ b/src/main/java/org/testng/internal/MethodHelper.java
@@ -750,7 +750,7 @@ public void runConfigurationMethod(ITestResult tr) {
}
}
};
- runMethod.invoke(instance, new Object[] { callback, testResult });
+ runMethod.invoke(configurableInstance, new Object[] { callback, testResult });
if (error[0] != null) {
throw error[0];
}
@@ -791,7 +791,7 @@ public void runTestMethod(ITestResult tr) {
}
}
};
- runMethod.invoke(testInstance, new Object[]{callback, testResult});
+ runMethod.invoke(hookableInstance, new Object[]{callback, testResult});
if (error[0] != null) {
throw error[0];
}
diff --git a/src/test/java/test/hook/ConfigurableListener.java b/src/test/java/test/hook/ConfigurableListener.java
new file mode 100644
index 0000000000..0690da8064
--- /dev/null
+++ b/src/test/java/test/hook/ConfigurableListener.java
@@ -0,0 +1,16 @@
+package test.hook;
+
+import org.testng.IConfigurable;
+import org.testng.IConfigureCallBack;
+import org.testng.ITestResult;
+
+public class ConfigurableListener implements IConfigurable {
+ public static int m_hookCount = 0;
+
+ @Override
+ public void run(IConfigureCallBack callBack, ITestResult testResult) {
+ m_hookCount++;
+ callBack.runConfigurationMethod(testResult);
+ }
+
+}
diff --git a/src/test/java/test/hook/ConfigurableSuccessWithListenerTest.java b/src/test/java/test/hook/ConfigurableSuccessWithListenerTest.java
new file mode 100644
index 0000000000..6c3ea6acf6
--- /dev/null
+++ b/src/test/java/test/hook/ConfigurableSuccessWithListenerTest.java
@@ -0,0 +1,30 @@
+package test.hook;
+
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+
+@Listeners(ConfigurableListener.class)
+public class ConfigurableSuccessWithListenerTest {
+ protected boolean m_bm = false;
+ protected boolean m_bc = false;
+
+ @BeforeMethod
+ public void bm() {
+ m_bm = true;
+ }
+
+ @BeforeClass
+ public void bc() {
+ m_bc = true;
+ }
+
+ @Test
+ public void hookWasRun() {
+ Assert.assertEquals(ConfigurableListener.m_hookCount, 2);
+ Assert.assertTrue(m_bc);
+ Assert.assertTrue(m_bm);
+ }
+}
diff --git a/src/test/java/test/hook/HookListener.java b/src/test/java/test/hook/HookListener.java
new file mode 100644
index 0000000000..85a30bf930
--- /dev/null
+++ b/src/test/java/test/hook/HookListener.java
@@ -0,0 +1,16 @@
+package test.hook;
+
+import org.testng.IHookCallBack;
+import org.testng.IHookable;
+import org.testng.ITestResult;
+
+public class HookListener implements IHookable {
+ public static boolean m_hook = false;
+
+ @Override
+ public void run(IHookCallBack callBack, ITestResult testResult) {
+ m_hook = true;
+ callBack.runTestMethod(testResult);
+ }
+
+}
diff --git a/src/test/java/test/hook/HookSuccessWithListenerTest.java b/src/test/java/test/hook/HookSuccessWithListenerTest.java
new file mode 100644
index 0000000000..9d6fb0f7a0
--- /dev/null
+++ b/src/test/java/test/hook/HookSuccessWithListenerTest.java
@@ -0,0 +1,14 @@
+package test.hook;
+
+import org.testng.Assert;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+
+@Listeners(HookListener.class)
+public class HookSuccessWithListenerTest {
+
+ @Test
+ public void verify() {
+ Assert.assertTrue(HookListener.m_hook);
+ }
+}
diff --git a/src/test/resources/testng-single.xml b/src/test/resources/testng-single.xml
index 527f850431..b5f4f9399b 100644
--- a/src/test/resources/testng-single.xml
+++ b/src/test/resources/testng-single.xml
@@ -29,7 +29,7 @@
-
+