【发布时间】:2015-01-18 11:20:48
【问题描述】:
我是单元测试的新手,遇到了一个我似乎无法弄清楚的 jMock 问题。我有一个公共的最终实例变量,我需要为其定义一个期望,但我无法让它工作。如果我为变量创建一个 getter,它可以工作,但我宁愿不必创建一堆 getter 只是为了使单元测试工作。任何有关如何做到这一点的帮助将不胜感激。这是一些说明我正在尝试做的代码:
public class Main {
private SimpleObject simpleObject;
public Main(SimpleObject o){
this.simpleObject = o;
}
public int iDontWork(){
return simpleObject.myList.size();
}
public int iWork(){
return simpleObject.getMyList().size();
}
}
我的测试:
@RunWith(JMock.class)
public class MainTest {
Mockery context = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
@Mock
SimpleObject simpleObject;
private Main main;
@Before
public void setup(){
main = new Main(simpleObject);
}
@Test
public void itWorks() {
context.checking(new Expectations() {{
oneOf(simpleObject).getMyList();
will(returnValue(new ArrayList<String>(Arrays.asList("Hey"))));
}});
int i = main.iWork();
assertEquals(1, i);
}
@Test
public void itDoesntWork() {
context.checking(new Expectations() {{
oneOf(simpleObject).myList.size(); will(returnValue(1));
}});
int i = main.iDontWork();
assertEquals(1, i);
}
}
简单对象:
public class SimpleObject {
public final List<String> myList;
public SimpleObject(){
myList = Collections.unmodifiableList(Arrays.asList("Hey"));
}
public List<String> getMyList(){
return myList;
}
}
【问题讨论】:
-
嗯,你说的公共最终实例变量在哪里?我在任何地方都没有看到。此外,无论如何创建 getter 是常规的,因为许多自动化工具会扫描 getter 以找出对象具有哪些字段。也许看看 Groovy,它会自动为您生成它们?
-
啊,我想你说的是
SimpleObject。拥有这些吸气剂是惯例。 -
真的吗?一些开源项目disagree:“Prefer public final fields to private fields with getter。”
-
那么我不同意 Cassandra 团队的观点。没有 getter 将阻止基于 JavaBeans 的工具自动处理该属性。 (也就是说,我通常会使用 Groovy 而没有样板文件。)
-
为什么要模拟出列表?它完全被
SimpleObject封装,所以你可以通过它的公共API 来测试SimpleObject的行为。需要模拟集合类是非常罕见的,因为它们的行为是巨大的,并且是集合中数据的函数,所以模拟没有任何好处(以及实际成本,因为您可能正在对集合进行规范而不是现实)
标签: java unit-testing jmock