2009-03-01 14 views
9

clases de ejemplo de Java bajo prueba¿Puedo usar coerción de mapa en Groovy para simular una clase con un constructor que tiene parámetros?

public class Sample { 
    public void printPie() { 
     System.out.println("Pie."); 
    } 
} 

public class SampleCont { 
    String _PIE; 

    public SampleCont() { 
     _PIE = "pie"; 
    } 
    public void printPie() { 
     System.out.println(_PIE); 
    } 
} 


public class SampleContArg { 
    String _PIE; 

    public SampleContArg(String pie) { 
     _PIE = pie; 
    } 
    public void printPie() { 
     System.out.println(_PIE); 
    } 
} 

La clase de prueba maravilloso

public class TestPie extends GroovyTestCase{ 

    void test_Sample() 
    { 
     def mock = [printPie: {print "NotPie"}] as Sample 
     mock.printPie() 
    } 

    void test_SampleCont() 
    { 
     def mock = [printPie: {print "NotPie"}] as SampleCont 
     mock.printPie() 
    } 

    void test_SampleContArg() 
    { 
     def mock = [printPie: {print "NotPie"}] as SampleContArg 
     mock.printPie() 
    } 
} 

Las dos primeras pruebas compilar y ejecutar bien. La última prueba no se ejecuta debido a una excepción:

java.lang.ArrayIndexOutOfBoundsException: 0 
    at SampleContArg_groovyProxy.<init>(Script1.groovy:4) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.codehaus.groovy.runtime.MetaClassHelper.doConstructorInvoke(MetaClassHelper.java:595) 
    at groovy.lang.MetaClassImpl.doConstructorInvoke(MetaClassImpl.java:2359) 
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1255) 
    at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1185) 
    at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:809) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeNewN(ScriptBytecodeAdapter.java:230) 
    at Script1.run(Script1.groovy:9) 
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:543) 
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518) 
    at groovy.util.ProxyGenerator.instantiateAggregate(ProxyGenerator.java:201) 
    at groovy.util.ProxyGenerator.instantiateAggregateFromBaseClass(ProxyGenerator.java:70) 
    at groovy.util.ProxyGenerator.instantiateAggregateFromBaseClass(ProxyGenerator.java:66) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.asType(DefaultGroovyMethods.java:3811) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.codehaus.groovy.runtime.metaclass.ReflectionMetaMethod.invoke(ReflectionMetaMethod.java:51) 
    at org.codehaus.groovy.runtime.metaclass.NewInstanceMetaMethod.invoke(NewInstanceMetaMethod.java:54) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756) 
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766) 
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.asType(ScriptBytecodeAdapter.java:622) 
    at com.hp.vse.cp.cli.agentless.ssh.TestPie.test_SampleContArg(TestPie.groovy:24) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at junit.framework.TestCase.runTest(TestCase.java:154) 
    at junit.framework.TestCase.runBare(TestCase.java:127) 
    at junit.framework.TestResult$1.protect(TestResult.java:106) 
    at junit.framework.TestResult.runProtected(TestResult.java:124) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:118) 
    at junit.framework.TestSuite.runTest(TestSuite.java:208) 
    at junit.framework.TestSuite.run(TestSuite.java:203) 
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 

En el caso de la tercera clase anterior, ¿puedo usar la coacción mapa maravilloso para burlarse de la clase? Si es así, ¿qué estoy haciendo mal?

Respuesta

7

Existe el método ProxyGenerator.instantiateAggregateFromBaseClass que puede aceptar argumentos de constructor. Pero desafortunadamente, el operador as no lo llamará por ti.

Entonces, la respuesta es no, por el momento.

FYI, "as" invocará uno de los métodos DefaultGroovyMethods.asType(), pero ninguno de ellos llama al instantiateAggregateFromBaseClass que usted quería.

+1

Como una extensión a esta pregunta. ¿Podemos usar coerción de cierre para lograr un método simulado usando parámetros? – benzen

Cuestiones relacionadas