【问题标题】:Mocking generic parameter模拟泛型参数
【发布时间】:2013-07-03 20:49:10
【问题描述】:

我正在尝试使用 JMock 模拟以下方法,但遇到了编译器错误。

模拟类:

public interface myClass<T extends SomeClass>{
public void myMethod(T parameter);
public void myOtherMethod();
}

模拟预期:

exactly(1).of(myClassMocked).myOtherMethod();
exactly(1).of(myClassMocked).myMethod( with(any(SomeClass.class)) );

编译错误:

myClass 类型中的方法 myMethod(capture#6-of ?) 不适用于参数 (SomeClass)

我尝试将 Object.class 与其他兼容的类切换并使用匹配器。

我无法简单地更改方法签名,那太容易了。

总而言之,我想忽略这个特定的方法调用,但我不能忽略整个 MyClass 模拟,因为它是我在测试方法中用于其他任务的服务。

编辑: 解决方法是改变 final myClass&lt;?&gt; myClassMocked= mockery.mock(myClass.class); (eclipse建议的通用规范)到 final myClass&lt;SomeClass&gt; myClassMocked= mockery.mock(myClass.class);

【问题讨论】:

    标签: java generics mocking jmock


    【解决方案1】:

    使用 T 参数化接口意味着必须在编译时定义类型。问题在于您获取myClassMocked 的方式,这就是为什么它期待“任何”通配符?

    您应该模拟myClass 接口的子类,该接口使用extends SomeClass 的类型进行参数化,例如:

    public class myClassImpl implements myClass<SomeSubclassOfSomeClass>{
        public void myMethod(SomeSubclassOfSomeClass parameter){...}
        public void myOtherMethod(){...}
    }
    

    【讨论】:

    • 我正要重构我的测试类时,我注意到当我声明我的模拟时,我传递了一个通配符。我切换了,现在一切正常。感谢您为我指明正确的方向。
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2020-11-27
    • 2017-04-22
    • 1970-01-01
    • 2020-08-28
    • 2019-10-01
    • 2011-07-15
    • 2012-10-04
    相关资源
    最近更新 更多