[英]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.