2009-03-01 7 views
9

пример Java классы испытуемымМогу ли я использовать принуждение карты в groovy, чтобы издеваться над классом с конструктором с параметрами?

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

Отлич- тестовый класс

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

Первые два теста компиляции и запуска отлично. Последний тест не запускается из-за исключение:

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) 

В случае третьего класса выше, могу ли я использовать заводную карту принуждение издеваться классом? Если да, то что я делаю неправильно?

ответ

7

Существует метод ProxyGenerator.instantiateAggregateFromBaseClass, который может принимать аргументы конструктора. Но, к сожалению, оператор не вызовет его для вас.

Итак, на данный момент ответа нет.

FYI "as" будет ссылаться на один из методов DefaultGroovyMethods.asType(), но ни один из них не вызывает требуемый экземпляр aggregateAggregateFromBaseClass.

+1

В дополнение к этому вопросу. Можем ли мы использовать принуждение к закрытию для достижения макетного метода с использованием параметров? – benzen