【问题标题】:Can't mock method(Class<? extends SomeClass>)不能模拟方法(Class<? extends SomeClass>)
【发布时间】:2013-01-22 20:02:58
【问题描述】:

我正在尝试模拟一个枚举:

public enum SomeEnum implements BaseEnum{

    SOME_VALUE("Description", SomeClass.class);

    private Class<? extends IConsignador> integracao;
    private String descricao;

    TipoIntegracao(String descricao, Class<? extends IConsignador> integracao){
        this.descricao = descricao;
        this.integracao = integracao;
    }

    @Override 
    public String getDescricao() {
        return descricao;
    }

    public Class<? extends IConsignador> getIntegracao() {
        return integracao;
    }
}

还有我的模拟:

SomeEnum mock = createMock(SomeEnum.class);
expect(mock.getIntegracao()).andReturn( (Class<? extends IConsignador>) eq(ClassWithOutPublicConstructor.class ) );
replay(mock);

但是日食说:

The method andReturn(Class<capture#1-of ? extends IConsignador>) in the type IExpectationSetters<Class<capture#1-of ? extends IConsignador>> is not applicable for the arguments (Class<capture#2-of ? extends IConsignador>)

他建议了演员表,但仍然不接受这个值。 会是什么?

【问题讨论】:

  • 是什么让你认为你可以首先模拟一个枚举?我认为你不应该这样做。除了在编译时提供枚举常量之外,不应以任何方式创建枚举实例。

标签: java junit easymock


【解决方案1】:

与其他难以模拟的事情一样,考虑从 Enum 中提取接口并直接模拟接口。模拟 Enum 是个坏主意,因为它破坏了 Enum 上的静态和实例方法的一般约定(例如 ordinal()values())。

就 EasyMock 而言,EasyMock 显然在有界通配符方面存在一些问题。尝试使用this syntax

EasyMock.<Class<? extends IConsignador>>expect(
    mock.getIntegracao())
    .andReturn(ClassWithOutPublicConstructor.class);

你还在你的thenReturn 中留下了一个eq,这是 EasyMock 不喜欢的。匹配器仅适用于expect 的参数。抱歉,我之前没看到。

【讨论】:

  • 我认为这是个好主意(我为什么不这么想!?)。仍然没有工作。现在我只模拟界面。但是他仍然不接受ClassWithOutPublicConstructor.class(它实现了接口IConsignador)。我相信问题出在返回类型Class &lt;? extends SomeInterface&gt;
  • 已解决!在枚举中使用两种方法的除法方法。第一个接收枚举,获取一个类并传递给第二个方法。所以不需要模拟(EasyMock),我可以将类直接传递给第二种方法。你的反应是根本性的。谢谢。
  • @Falci 我更新了我的答案,刚刚弄清楚它可能是什么。感谢您的接受。干杯!
猜你喜欢
  • 2018-12-01
  • 2015-10-05
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多