gpt4 book ai didi

java - 无法在 JMockit 中模拟通用接口(interface)

转载 作者:行者123 更新时间:2023-12-01 09:26:24 24 4
gpt4 key购买 nike

我想模拟一个通用接口(interface):

public interface IModel<T, S> {
public S classify(T entity);
}

此接口(interface)由 3 个具体类划分为子类:TextModelImageModelScoringModel。每个具体类都有不同的 T 和 S 参数。

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

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:

java.lang.IllegalArgumentException: Value of type com.classificationmanager.model.$Impl_IModel incompatible with return type com.classificationmanager.model.TextModel of com.classificationmanager.model.TextModelFactory#createModel(com.classificationmanager.model.ModelDescriptor) at com.classificationmanager.model.ModelFetcherTest$5.(ModelFetcherTest.java:110) at com.classificationmanager.model.ModelFetcherTest.mockAllFactories(ModelFetcherTest.java:109) ....... (spared you the rest)

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

private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
return new MockUp<T>() {
}.getMockInstance();
}

我可以做一个 switch-case 并返回一个具体的类,但这会很糟糕。

任何涉及 Expectations API 的解决方法也适合我。

10x

最佳答案

也许以下示例可以提供帮助(尽管我仍然不明白这个问题 - XY 问题的可能情况)。

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);
}
}

关于java - 无法在 JMockit 中模拟通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com