首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在MockUp中使用JMockit的通用接口

无法在MockUp中使用JMockit的通用接口
EN

Stack Overflow用户
提问于 2016-09-30 23:45:49
回答 1查看 998关注 0票数 0

我想模拟一个通用接口:

代码语言:javascript
复制
public interface IModel<T, S> {
    public S classify(T entity);
}

该接口由3个具体类组成:TextModelImageModelScoringModel.每个具体类都有不同的T和S参数。

我编写了一个泛型方法,它接收具体的模型类作为参数,并生成模型的模拟版本:

代码语言:javascript
复制
private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
    return new MockUp<T>() {
        @Mock public Object classify(Object entity) { return null; }
    }.getMockInstance();
}

我知道IModel::classify的输入和输出都有泛型类型,但我还没有找到在模型中使用实际泛型方法的方法。

调用此方法时,我将得到一个IllegalArgumentException

.#en1#=‘#en1#2’> com.classificationmanager.model.TextModelFactory#createModel(com.classificationmanager.model.ModelDescriptor)在com.classificationmanager.model.ModelFetcherTest$5.(ModelFetcherTest.java:110) at com.classificationmanager.model.ModelFetcherTest.mockAllFactories(ModelFetcherTest.java:109) .(放过你剩下的)

我认为获得和返回一个Object而不是T和S是问题所在,但在删除模拟方法和仅仅模拟类时,我得到了相同的异常:

代码语言:javascript
复制
private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
    return new MockUp<T>() {
    }.getMockInstance();
}

我可以做一个开关,并返回一个具体的类,但这将是讨厌的。

任何涉及期望值API的解决方案也都适用于我。

10倍

EN

回答 1

Stack Overflow用户

发布于 2016-10-03 15:40:44

也许下面的例子会有所帮助(尽管我仍然不理解XY问题的问题--可能的情况)。

代码语言:javascript
复制
public final class ExampleTest {
    public interface IModel<T, S> { S classify(T entity); }

    static class TextModel implements IModel<Integer, String> {
        @Override public String classify(Integer entity) { return "test"; }
    }

    static class ImageModel implements IModel<String, Image>  {
        @Override public Image  classify(String entity)  { return null; }
    }

    @Test
    public void createNonMockedInstanceForAnyModelClass() {
        IModel<Integer, String> m1 = mockModel(TextModel.class);
        String s = m1.classify(123);

        IModel<String, Image> m2 = mockModel(ImageModel.class);
        Image img = m2.classify("test");

        assertEquals("test", s);
        assertNull(img);
    }

    <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
        // Or use newUninitializedInstance in case the model class doesn't
        // have a no-args constructor.
        return Deencapsulation.newInstance(modelClass);
    }

    @Test
    public void mockAllModelImplementationClassesAndInstances(
        @Capturing IModel<?, ?> anyModel
    ) {
        IModel<Integer, String> m = new TextModel();
        String s = m.classify(123);

        assertNull(s);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39801542

复制
相关文章

相似问题

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