【问题标题】:Define expectations for public final instance variable定义公共最终实例变量的期望
【发布时间】: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


【解决方案1】:

模拟对象实现了真实对象的方法。它没有真实对象的字段(即使这些字段是公共的)。

【讨论】:

  • 模拟对象实现了真实对象的部分公共 API。公共字段是该公共 API 的一部分。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2016-04-15
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多