我想嘲笑通用接口:無法樣機通用接口在JMockit
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
:
java.lang.IllegalArgumentException異常:類型com.classificationmanager.model價值$ Impl_IModel與COM的返回類型com.classificationmanager.model.TextModel不兼容。 classificationmanager.model.TextModelFactory#createModel(com.classificationmanager.model.ModelDescriptor) 在com.classificationmanager.model.ModelFetcherTest $ 5(ModelFetcherTest.java:110) 在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();
}
我可以做一個開關並返回一個具體的類,但這隻會是討厭的。
任何涉及Expectations API的解決方法也適用於我。
10X
爲什麼不使用'@Mocked TextModel'? –
我可以,但後來我不得不模擬ImageModel,ScoringModel和IModel的所有未來具體子類 – KidCrippler
您是不是已經通過調用'mockModel(TextModel.class)'來做到這一點,正如問題中所暗示的那樣? –