我正在为一个需要在自身内部创建多个集合的类编写 JMock 测试。我正在为该类提供一个工厂,该工厂将在需要时生成一个 Collection。
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 的调用顺序,但我可以看到这不起作用的情况(例如泛型类型的池)。
这可以做到吗?