における一般的なインタフェースのモックアップすることができません:TextModel
、ImageModel
、ScoringModel
:このインタフェースは、3つの具象クラスによってサブクラス化され私は一般的なインタフェースモックとしたいJMockit
public interface IModel<T, S> {
public S classify(T entity);
}
を。これらの具象クラスのそれぞれは、異なるTおよびSパラメータを有する。
私は、引数として、具体的なモデルクラスを受信して、モデルの嘲笑バージョンを生成し、一般的な方法を書いた:私はIModel::classify
は、その入力と出力の両方のための一般的な種類を持っていることを知っている
private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
return new MockUp<T>() {
@Mock public Object classify(Object entity) { return null; }
}.getMockInstance();
}
が、私モックアップ内で実際のジェネリックメソッドを使用する方法が見つかりませんでした。
java.lang.IllegalArgumentExceptionが::。comの戻り値の型com.classificationmanager.model.TextModelと互換性のない型com.classificationmanager.modelの価値$のImpl_IModel
このメソッドを呼び出す
は私がIllegalArgumentException
を取得します。 (ModelFetcherTest.java:110) at com.classificationmanager.model.ModelFetcherTest.mockAllFactories(ModelFetcherTest.java:ModelFetcherTest.java:ClassMemoryFetcherTest.maxAllFactories) 109).......(残りを惜しまない)
私の代わりにTとSのObject
を取得して返すことは問題だと思ったが、モックメソッドを削除し、ちょうどクラスをからかったとき、私は同じ例外を取得:
private <T extends IModel<?, ?>> T mockModel(Class<T> modelClass) {
return new MockUp<T>() {
}.getMockInstance();
}
私はスイッチを行うことができます - ケースと具体的なクラスを返すが、それはちょうど厄介かもしれません。
Expectations APIを使用しているすべての回避策も私にとっては役に立ちます。 ( - XYの問題の可能性場合、私はまだ質問を理解していないが)
10倍
なぜ@Mocked TextModelを使用しないのですか? –
私はできましたが、ImageModel、ScoringModel、今後IModelのすべての具体的なサブクラスを模倣する必要があります – KidCrippler
質問で暗示されているように、 'mockModel(TextModel.class)'を呼び出すことでこれをやっていませんか? –