gpt4 book ai didi

java - JMock 通用返回类型

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:46 26 4
gpt4 key购买 nike

我正在为一个需要在其内部创建多个集合的类编写 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com