我有一个类,其字段类型为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.lang.Class模拟不能模拟最终的类。如果测试中的代码是用Groovy编写的,那么使用Groovy模拟。
但是:
GroovyMock(Class)给予:
java.lang.IllegalAccessError: java.lang.Class
有什么正确的方法来模拟类来验证它的交互吗?
发布于 2017-05-08 09:11:38
人们不应该这样做,因为我怀疑它可能会有一些副作用,但要回答以下问题将有效:
def dummyObject = new Object()
Class.metaClass.static.newInstance = { dummyObject }
def clazz = String
assert clazz.newInstance() == dummyObject
clazz = Integer
assert clazz.newInstance() == dummyObject还请注意,Class.newInstance应在末尾设置为原始
发布于 2017-05-08 09:09:53
在课堂上做一个包装类怎么样?然后,您可以让包装类实现一个接口,然后为该接口创建一个模拟:
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();
}
}https://stackoverflow.com/questions/43841736
复制相似问题