2017-05-08 85 views
0

我有一個類類型java.lang.Class的字段:Spock。如何模擬java.lang.Class?

Class clazz 

也就是說然後在sevaral方法中使用以下方式:

Object profile = objectDAO.get(clazz, id) 
... 
clazz.newInstance() 

的問題是,我會遇到的問題嘲笑java.lang.Class。我想:

Mock(Class) 

,並得到:

org.spockframework.mock.CannotCreateMockException: Cannot create mock for class java.lang.Class because Java mocks cannot mock final classes. If the code under test is written in Groovy, use a Groovy mock.

但:

GroovyMock(Class) 

給出:

java.lang.IllegalAccessError: java.lang.Class

是否有模擬類,以驗證它的交互的任何適當的方式?

+0

爲什麼你不使用自己的類或接口被設置爲原?你可以在你的DAO層中使用泛型類型。 – Victor1125

+1

安東,這是相當可撤銷的。您能否請您分享您的設計,以便我們提供替代解決方案? – Opal

+1

@Opal,謝謝你的建議。我解決了這個問題,我需要一個'Object.class'來傳遞它,它是一個虛擬實例來驗證結果,而不是交互本身。 –

回答

0

一個,因爲我懷疑它可能有一些副作用,但要回答這個問題下面不應該這樣做將工作:

def dummyObject = new Object() 

Class.metaClass.static.newInstance = { dummyObject } 

def clazz = String 
assert clazz.newInstance() == dummyObject 

clazz = Integer 
assert clazz.newInstance() == dummyObject 

還要注意的是Class.newInstance應在年底

0

如何圍繞Class製作包裝類?然後,您可以讓包裝類實現一個接口,然後該接口創建一個模擬:

public interface ClassWrapper { 
    Class<?> getClazz(); 
    Object newInstance() throws InstantiationException, IllegalAccessException; 
} 

public class ClassWrapperImpl implements ClassWrapper { 
    private Class<?> clazz; 

    public ClassWrapperImpl(Class<?> clazz) { 
     this.clazz = clazz; 
    } 

    @Override 
    public Class getClazz() { 
     return this.clazz; 
    } 

    @Override 
    public Object newInstance() throws InstantiationException, IllegalAccessException { 
     return this.clazz.newInstance(); 
    } 

    // add more methods of the Class class that needs to be wrapped 
} 

public class SomeClass { 
    private ClassWrapper cw; 

    void methodA(Class<?> clazz) { 
     cw = new ClassWrapperImpl(clazz); // (or better use dependency injection) 
    } 

    void methodB() {   
     Object profile = objectDAO.get(cw.getClazz(), id);   
     cw.newInstance();   
    } 
}