java - JMock 通用返回类型

标签 java generics jmock

我正在为一个需要在其内部创建多个集合的类编写 JMock 测试。我为该类提供一个工厂,它将在需要时生成一个集合。

interface Factory
{
    <T> Collection<T> newCollection();
}

class MyClass
{
    public MyClass(Factory f)
    {
        List<ThingA> la = f.newCollection();
        List<ThingB> lb = f.newCollection();
    }
}

现在可以了,但是当使用 JMock 测试“MyClass”时,我无法模拟此返回类型重载。

Collection<ThingA> ta = new LinkedList<ThingA>();
Collection<ThingB> tb = new LinkedList<ThingB>();
Collection<ThingC> tc = new LinkedList<ThingC>();

Factory mockFactory = context.mock(Factory.class);
context.checking(new Expectations()
{
    {
        allowing(mockFactory).newCollection(); will(returnValue(ta));
        allowing(mockFactory).newCollection(); will(returnValue(tb));
        allowing(mockFactory).newCollection(); will(returnValue(tc));
    }
}
);

// All return ta
Collection<ThingA> ta2 = mockFactory.newCollection();
Collection<ThingB> tb2 = mockFactory.newCollection();
Collection<ThingC> tc2 = mockFactory.newCollection();

有什么办法可以让它发挥作用吗?我知道我可以传入 ThingX 作为参数,但如果它只是为了触发测试的类型检查,这似乎有点毫无意义。

我当前的修复方法是添加一个序列,以便强制执行对 newCollection 的调用顺序,但我可以看到这不起作用的情况(例如泛型类型池)。

这可以做到吗?

最佳答案

类型删除妨碍了您想要做的事情。正如您提到的,我只是传递一个 ThingX (或 ThingX.class)。不幸的是,类型删除迫使你做那种hacky的事情。

最好将您的代码视为分为两个域:通用感知和通用不感知,当您必须将事物从后一个域粘合到前一个域时,没有办法避免执行这两个域之一(为了使事情处于控制之下):

传递参数只是为了触发类型检查(按照您的建议):

Collection<ThingA> ta2 = mockFactory.newCollection(ThingA.class);
Collection<ThingB> tb2 = mockFactory.newCollection(ThingB.class);
Collection<ThingC> tc2 = mockFactory.newCollection(ThingC.class);

或者将不支持泛型的代码封装到以下方法中:a) 支持泛型,b) 具有 @SuppressWarnings("unchecked") 注释,以抑制从一个域分配到另一个域时收到的警告。

class MockFactoryThingie
{
   /**
    *@SuppressWarnings("unchecked")
    */
   Collection<ThingA> newThingACollection()
   { 
     return (Collection<ThingA>) ... your generic-unaware collection thing...   
   }
}

无论哪种方式都很笨拙。我们要感谢我们的 Java/JCP 霸主赐予我们这个类型删除的 gem :)

关于java - JMock 通用返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146272/

相关文章:

java - 选择均匀随机的位点来阻止剩余的阵列位点

generics - Vala - 打印通用值

c# - 当类型已知时,类型 'T' 不能用作泛型类型或方法错误中的类型参数

java - 如何使用Java访问json中的嵌套字段?

java - 再次更新 JFrame

java.io.InvalidClassException : serialization from string to object fail java

Java-使用泛型返回多个类型

java - JUnit 模拟,我应该使用哪个工具?

java - 检查一个方法是否在另一个方法中被调用

java - JMock "unexpected invocation"当相同的调用是 "expected once, never called"