2009-03-01 19 views
9

lớp Java dụ dưới kiểm traTôi có thể sử dụng ép buộc bản đồ trong groovy để giả lập một lớp với một hàm tạo có các tham số không?

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

Các lớp thử nghiệm groovy

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

Hai bài kiểm tra đầu tiên biên dịch và chạy tốt. Thử nghiệm thứ hai không chạy do một ngoại lệ:

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) 

Trong trường hợp lớp thứ ba ở trên, tôi vẫn có thể sử dụng bản đồ groovy để ép buộc lớp học không? Nếu vậy, tôi đang làm gì sai?

Trả lời

7

Có phương pháp ProxyGenerator.instantiateAggregateFromBaseClass có thể chấp nhận đối số hàm tạo. Nhưng thật không may, các nhà điều hành như sẽ không gọi nó cho bạn.

Vì vậy, câu trả lời là không, tại thời điểm này.

FYI, "dưới dạng" sẽ gọi một trong các phương thức DefaultGroovyMethods.asType(), nhưng không có phương thức nào trong số chúng gọi là instantiateAggregateFromBaseClass mà bạn muốn.

+1

Là phần mở rộng cho câu hỏi này. Chúng ta có thể sử dụng cưỡng chế đóng cửa để đạt được một phương pháp giả sử dụng các tham số? – benzen

Các vấn đề liên quan