首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >史波克。如何模仿java.lang.Class?

史波克。如何模仿java.lang.Class?
EN

Stack Overflow用户
提问于 2017-05-08 07:09:47
回答 2查看 2.1K关注 0票数 1

我有一个类,其字段类型为java.lang.Class:

代码语言:javascript
复制
Class clazz

然后,在sevaral方法中使用它的方式如下:

代码语言:javascript
复制
Object profile = objectDAO.get(clazz, id)
...
clazz.newInstance()

问题是,我在模拟java.lang.Class时遇到了问题。我试过:

代码语言:javascript
复制
Mock(Class)

并得到:

org.spockframework.mock.CannotCreateMockException:不能为类java.lang.Class创建模拟,因为java.lang.Class模拟不能模拟最终的类。如果测试中的代码是用Groovy编写的,那么使用Groovy模拟。

但是:

代码语言:javascript
复制
GroovyMock(Class)

给予:

java.lang.IllegalAccessError: java.lang.Class

有什么正确的方法来模拟类来验证它的交互吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-08 09:11:38

人们不应该这样做,因为我怀疑它可能会有一些副作用,但要回答以下问题将有效:

代码语言:javascript
复制
def dummyObject = new Object()

Class.metaClass.static.newInstance = { dummyObject }

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

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

还请注意,Class.newInstance应在末尾设置为原始

票数 2
EN

Stack Overflow用户

发布于 2017-05-08 09:09:53

在课堂上做一个包装类怎么样?然后,您可以让包装类实现一个接口,然后为该接口创建一个模拟:

代码语言:javascript
复制
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();           
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43841736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档