2013-08-26 21 views
2

我正在使用CodeModel 2.6。如何使用CodeModel從二級抽象超類調用一個方法?

當getType()方法從抽象超類繼承,JDefinedClass上方的兩個級別繼承時,如何生成此指令?

assertEquals(GeneraldocumenMetadata.TYPE, generaldocumenMetadata.getType()); 

背景:

  1. 中的assertEquals(...)方法來源於 「進口靜態org.junit.Assert.assertEquals;」
  2. 的類層次結構是
    • GeneraldocumenMetadata延伸ItemMetadata
    • ItemMetadata延伸AbstractItemMetadata
    • AbstractItemMetadata擁有對GetType()方法,和私營類型字段

最終結果/所需方法如下:

@Test 
public void testParameterizedConstructorSuccess() 
{ 
    String modifiedType = GeneraldocumenMetadata.TYPE + "andMore"; 
    generaldocumenMetadata = new GeneraldocumenMetadata(modifiedType); 

    assertEquals(modifiedType, generaldocumenMetadata.getType()); 
} 

CodeModel方法現在看起來像這樣,但是「definedClass.getMethod(」getType「,new JType [] {}); 「在返回空

private void testDefaultConstructorMethod(JFieldVar uutField, JVar staticTYPEVar, final JDefinedClass unitTestClass, JDefinedClass definedClass, JCodeModel codeModel) 
{ 
    int modifiers = JMod.PUBLIC; 

    JMethod unitTestMethod = unitTestClass.method(modifiers, Void.TYPE, "testDefaultConstructor"); 
    unitTestMethod.annotate(org.junit.Test.class); 

    JBlock unitTestBody = unitTestMethod.body(); 

    unitTestBody.assign(uutField, JExpr._new(unitTestClass)); 
    JClass abstractItemMetadataClass = definedClass._extends(); 

    JMethod getTypeMethod = definedClass.getMethod("getType", new JType[] {}); 
    JExpr.invoke(getTypeMethod); 

    JInvocation assertEqualsInvoke = codeModel.directClass("org.junit.Assert").staticInvoke("assertEquals").arg(staticTYPEVar).arg(JExpr.invoke(getTypeMethod)); 
    unitTestBody.add(assertEqualsInvoke); 
} 

回答

2

您需要調用的方法,而不是得到它codeModel不會解析您定義的類:

JExpr.invoke(uutField, "getType"); 

這意味着你的codemodel代碼如下所示:

private void testDefaultConstructorMethod(JFieldVar uutField, JVar staticTYPEVar, final JDefinedClass unitTestClass, JDefinedClass definedClass, JCodeModel codeModel) 
{ 
    int modifiers = JMod.PUBLIC; 

    JMethod unitTestMethod = unitTestClass.method(modifiers, Void.TYPE, "testDefaultConstructor"); 
    unitTestMethod.annotate(org.junit.Test.class); 

    JBlock unitTestBody = unitTestMethod.body(); 

    unitTestBody.assign(uutField, JExpr._new(unitTestClass)); 
    JClass abstractItemMetadataClass = definedClass._extends(); 

    JInvocation assertEqualsInvoke = codeModel.ref(org.junit.Assert.class).staticInvoke("assertEquals").arg(staticTYPEVar).arg(JExpr.invoke(uutField, "getType")); 
    unitTestBody.add(assertEqualsInvoke); 
} 
相關問題