簡體   English   中英

Spock。 如何模擬java.lang.Class?

[英]Spock. How to mock java.lang.Class?

我有一個字段類型為java.lang.Class的類:

Class clazz

然后按以下方式在sevaral方法中使用該方法:

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

問題是我在模擬java.lang.Class時遇到問題。 我試過了:

Mock(Class)

並得到:

org.spockframework.mock.CannotCreateMockException:無法為類java.lang.Class創建模擬,因為Java模擬無法模擬最終類。 如果要測試的代碼是用Groovy編寫的,請使用Groovy模擬。

但:

GroovyMock(Class)

給出:

java.lang.IllegalAccessError:java.lang.Class

有什么合適的方法可以模擬Class來驗證其交互作用?

我不應該這樣做,因為我懷疑它可能會產生一些副作用,但是要回答這個問題,可以使用以下方法:

def dummyObject = new Object()

Class.metaClass.static.newInstance = { dummyObject }

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

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

另請注意,應在最后將Class.newInstance設置為原始

圍繞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();           
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM