2009-03-01 4 views
9

Java Beispiel Klassen im TestKann ich in groovy Map Coercion verwenden, um eine Klasse mit einem Konstruktor zu verspotten, der Parameter hat?

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

The groovy Testklasse

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

Die ersten beiden Tests kompilieren und ausführen Ordnung. Letzteres Test läuft nicht aufgrund einer Ausnahme:

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) 

Im Fall der dritten Klasse oben, kann ich immer noch groovy Karte Zwang verwenden, um die Klasse zu verspotten? Wenn ja, was mache ich falsch?

Antwort

7

Es gibt die Methode ProxyGenerator.instantiateAggregateFromBaseClass, die Konstruktorargumente akzeptieren kann. Aber leider ruft der as-Operator sie nicht an.

Also, die Antwort ist nein, im Moment.

FYI, "as" ruft eine der DefaultGroovyMethods.asType() -Methoden auf, aber keiner von ihnen ruft die gewünschte instanziateAggregateFromBaseClass auf.

+1

Als eine Erweiterung dieser Frage. Können wir mithilfe von Abschlusszwängen eine Scheinmethode unter Verwendung von Parametern erreichen? – benzen

Verwandte Themen