Я хочу издеваться общий интерфейс:Невозможно макета общего интерфейса в 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.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();
}
Я мог бы сделать переключатель -case и вернуть конкретный класс, но это было бы просто противно.
Любое временное решение, связанное с API ожиданий, также будет работать для меня.
10x
Почему бы не использовать '@Mocked TextModel'? –
Я мог бы, но тогда мне придется издеваться над ImageModel, ScoringModel и всеми будущими конкретными подклассами IModel. – KidCrippler
. Разве вы уже этого не делаете, вызывая 'mockModel (TextModel.class)', что подразумевается в вопросе? –