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 @@ - +