unit test mock unit-testing groovy junit testng spock

unit testing - mock - ¿Puede TestNG ver los resultados de mi prueba Spock(JUnit)?



spock unit test (1)

Investigué más esto y al menos encontré la causa.

En org.testng.junit.JUnit4TestMethod a continuación, los nombres de las pruebas de Spock no se pueden resolver correctamente. Estoy adivinando, pero creo que Spock usa un tipo de nombre que funciona para soportar el buen nombre del método de texto que permite. Por lo tanto, aunque el código de TestNG a continuación obtiene un nombre de método como "Esta es mi prueba", no puede resolverlo por los medios que se muestran. Creo que el verdadero nombre del método es algo así como: $ spock_feature_0_0

private static Method getMethod(Description desc) { Class<?> c = desc.getTestClass(); String method = desc.getMethodName(); try { return c.getMethod(method); } catch (Throwable t) { Utils.log("JUnit4TestMethod", 2, "Method ''" + method + "'' not found in class ''" + c.getName() + "'': " + t.getMessage()); return null; } }

Como resultado, esto arroja una excepción en la llamada c.getMethod (método) - no puede resolver el nombre del método Spock a un método real en la clase.

Lo que realmente parece ''arruinar la situación'' es que el código anterior es llamado por Junit ( org.junit.runner.notification.RunNotifier ) en este código:

private abstract class SafeNotifier { void run() { synchronized (fListeners) { for (Iterator<RunListener> all= fListeners.iterator(); all.hasNext();) try { notifyListener(all.next()); } catch (Exception e) { all.remove(); // Remove the offending listener first to avoid an infinite loop fireTestFailure(new Failure(Description.TEST_MECHANISM, e)); } } }

sería realmente bueno para este código no eliminar silenciosamente al oyente, sino registrarlo ...

Necesito obtener TestNG para ejecutar mis pruebas de Spock ya que TestNG se usa en todo el resto del sistema.
Como TestNG admite la ejecución de pruebas JUnit, probé esto:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="suiteTestName" verbose="1" junit="true"> <test name="myTestName"> <classes> <class name="mypackage.artifact.SomeArtifactSpecification" /> </classes> </test> </suite>

Así que esto realmente ejecutó perfectamente la prueba Groovy ''SomeArtifactSpecification'' Spock Unit. Pude ver algunas E / S de las pruebas, pero desde que corrí desde Eclipse utilicé el depurador para verificar que todas las pruebas se ejecutaban correctamente. Mi classpath tiene TestNG-6.8.7 y JUnit-4.10 en él. ¡El problema es que TestNG no parece saber que sí lo hizo! Aquí está el resultado final:

=============================================== myTestName Total tests run: 0, Failures: 0, Skips: 0 ===============================================

¿Alguien sabe si es posible hacer que TestNG reconozca estas pruebas?

Detalles adicionales - agregados para Bounty

En uno de los comentarios a continuación, Peter declara que depende de lo que TestNG esté haciendo. Investigué eso tanto como pude. Parece que tanto Junit como TestNG invocan el método ''ejecutar'' de la línea 63 de la clase Sputnik de Spock. Sin embargo, cuando se invoca directamente desde JUnit, se llama a Sputnik desde JUnit4TestClassReference. Cuando se llama desde TestNG, se invoca Sputnik desde JUnitCore.

Entonces, la pregunta sigue siendo: ¿cómo lograr que TestNG reconozca los resultados de prueba de Spock? Si voy a vivir mucho tiempo y prosperar, ¡realmente necesito saberlo! Parece que la respuesta puede ser hacer que TestNG se ejecute con JUnit4TestClassReference, o usar algún tipo de envoltorio inteligente para hacer que TestNG lo haga ...

Para los detalles sangrientos, publiqué dos rastros de pila a continuación. El primero es de la ejecución de TestNG, que no funciona, el segundo es de ejecutar Spock directamente sin TestNG.

Primer registro de pila de TestNG:

org.testng.remote.RemoteTestNG at localhost:54288 Thread [main] (Suspended (breakpoint at line 65 in ArtifactManagerSpecification)) ArtifactManagerSpecification.$spock_feature_0_0() line: 65 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).invokeFeatureMethod() line: 285 ParameterizedSpecRunner(BaseSpecRunner).doRunIteration() line: 256 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runIteration(Object[], int) line: 223 ParameterizedSpecRunner(BaseSpecRunner).initializeAndRunIteration(Object[], int) line: 214 ParameterizedSpecRunner(BaseSpecRunner).runSimpleFeature() line: 205 ParameterizedSpecRunner(BaseSpecRunner).doRunFeature() line: 199 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runFeature() line: 175 ParameterizedSpecRunner(BaseSpecRunner).runFeatures() line: 152 ParameterizedSpecRunner(BaseSpecRunner).doRunSpec() line: 112 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runSpec() line: 91 ParameterizedSpecRunner(BaseSpecRunner).run() line: 82 Sputnik.run(RunNotifier) line: 63 JUnitCore.run(Runner) line: 157 JUnitCore.run(Request) line: 136 JUnit4TestRunner.start(Class, String...) line: 81 JUnit4TestRunner.run(Class, String...) line: 69 TestRunner$1.run() line: 682 TestRunner.runWorkers(List<IWorker<ITestNGMethod>>, String, ListMultiMap<Integer,TestMethodWorker>) line: 1005 TestRunner.privateRunJUnit(XmlTest) line: 713 TestRunner.run() line: 614 SuiteRunner.runTest(TestRunner) line: 334 SuiteRunner.runSequentially() line: 329 SuiteRunner.privateRun() line: 291 SuiteRunner.run() line: 240 SuiteRunnerWorker.runSuite(SuiteRunnerMap, XmlSuite) line: 52 SuiteRunnerWorker.run() line: 86 RemoteTestNG(TestNG).runSuitesSequentially(XmlSuite, SuiteRunnerMap, int, String) line: 1224 RemoteTestNG(TestNG).runSuitesLocally() line: 1149 RemoteTestNG(TestNG).run() line: 1057 RemoteTestNG.run() line: 111 RemoteTestNG.initAndRun(String[], CommandLineArgs, RemoteArgs) line: 204 RemoteTestNG.main(String[]) line: 175

Second Stack Trace (que funciona) ejecutando Spock directamente

Thread [main] (Suspended (breakpoint at line 65 in ArtifactManagerSpecification)) ArtifactManagerSpecification.$spock_feature_0_0() line: 65 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).invokeFeatureMethod() line: 285 ParameterizedSpecRunner(BaseSpecRunner).doRunIteration() line: 256 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runIteration(Object[], int) line: 223 ParameterizedSpecRunner(BaseSpecRunner).initializeAndRunIteration(Object[], int) line: 214 ParameterizedSpecRunner(BaseSpecRunner).runSimpleFeature() line: 205 ParameterizedSpecRunner(BaseSpecRunner).doRunFeature() line: 199 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runFeature() line: 175 ParameterizedSpecRunner(BaseSpecRunner).runFeatures() line: 152 ParameterizedSpecRunner(BaseSpecRunner).doRunSpec() line: 112 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 601 ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138 ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330 ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311 ParameterizedSpecRunner(BaseSpecRunner).runSpec() line: 91 ParameterizedSpecRunner(BaseSpecRunner).run() line: 82 Sputnik.run(RunNotifier) line: 63 JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 50 TestExecution.run(ITestReference[]) line: 38 RemoteTestRunner.runTests(String[], String, TestExecution) line: 467 RemoteTestRunner.runTests(TestExecution) line: 683 RemoteTestRunner.run() line: 390 RemoteTestRunner.main(String[]) line: 197