2009-03-01 10 views
9

classi Java esempio sotto testPosso usare la coercizione della mappa in Groovy per deridere una classe con un costruttore che ha parametri?

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 classe di test scanalato

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() 
    } 
} 

Le prime due prove compilare ed eseguire bene. Quest'ultima prova non viene eseguito a causa di un'eccezione:

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) 

Nel caso della terza classe di cui sopra, posso ancora usare la coercizione mappa groove per deridere la classe? In tal caso, cosa sto sbagliando?

risposta

7

C'è il metodo ProxyGenerator.instantiateAggregateFromBaseClass che è in grado di accettare gli argomenti del costruttore. Ma sfortunatamente, l'operatore as non lo chiamerà per te.

Quindi, la risposta è no, al momento.

FYI, "as" invocherà uno dei metodi DefaultGroovyMethods.asType(), ma nessuno di essi chiama l'instantiateAggregateFromBaseClass desiderato.

+1

Come estensione a questa domanda. Possiamo usare la coercizione di chiusura per ottenere un metodo simulato usando i paramter? – benzen

Problemi correlati