我想模拟一个通用接口:
public interface IModel<T, S> {
public S classify(T entity);
}该接口由3个具体类组成:TextModel、ImageModel、ScoringModel.每个具体类都有不同的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
.#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是问题所在,但在删除模拟方法和仅仅模拟类时,我得到了相同的异常:
private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
return new MockUp<T>() {
}.getMockInstance();
}我可以做一个开关,并返回一个具体的类,但这将是讨厌的。
任何涉及期望值API的解决方案也都适用于我。
10倍
发布于 2016-10-03 15:40:44
也许下面的例子会有所帮助(尽管我仍然不理解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);
}
}https://stackoverflow.com/questions/39801542
复制相似问题