【问题标题】:How to initialize mocked object?如何初始化模拟对象?
【发布时间】:2013-02-06 19:32:24
【问题描述】:

假设我有以下代码:
模拟对象类

public class SomeClass {
    private Foo someField;
    public SomeClass {
        someField = new Foo();
    }
    public Foo getSomeField { return someField; }
    public void getSomething() {}
    public boolean doSomething(Object object) {}
}

接下来我有测试套件

public class TestSuite {
    private ClassToTest classToTest;
    private SomeClass mock;

    @Before
    public void setUp() {
        classToTest = new ClassToTest();
        mock = EasyMock.createMock(SomeClass.class);
    }

    @Test
    public void testMethod() throws Exception { 
        mock.getSomething();
        EasyMock.replay(mock);

        classToTest.methodToTest(mock); //Where methodToTest accepts SomeClass and int

        EasyMock.verify(mock);
    }
}

以及正在测试的方法

public void methodToTest(SomeClass a) {
    //Logic here
    Foo b = a.getSomeField();
    b.do(); // <--- null pointer exception here because someField isn't initialized
    a.getSomething(); // <--- thing I want to test if it is being called, but can't due to exception prior to this line
    //Logic after
}

我被卡住了.. 所以基本上 SomeClass 没有像我想要的那样初始化。有什么解决方法吗?或者任何其他可以做类似事情的框架?

【问题讨论】:

    标签: java unit-testing junit mocking easymock


    【解决方案1】:

    您的methodToTest 调用a.getSomeField(),但您的测试的设置部分并不期望该调用。你想要这样的东西:

    Foo foo = new Foo();
    EasyMock.expect(mock.getSomeField()).andReturn(foo);
    

    或存根调用:

    Foo foo = new Foo();
    EasyMock.expect(mock.getSomeField()).andStubReturn(foo);
    

    (在您致电 mock.getSomething() 之前)。

    有关andReturn 和andStubReturn 之间的区别,请参阅this question。

    【讨论】:

    • 你说得对,我也忘了测试它。但事实并非如此。问题是您可以看到我的构造函数初始化someField,当我进行模拟时,someField 为空,因此整个methodToTest 中断。所以这意味着构造函数没有被调用?
    • @su234fk234hawuhsafklsfjs:你的 normal 实现的作用是无关紧要的。你在嘲笑那个类,所以它的行为并不重要。只要您模拟您正在进行的调用,以便 getSomeField() 返回一个非空引用,就可以了。
    • 但问题是getSomeField(); 确实返回null,因为SomeClass 初始化someField 没有别的,也没有setter。我不明白如果 NPE 被b.do(); 抛出,测试如何通过@
    • @su234fk234hawuhsafklsfjs:如果你告诉 EasyMock 返回不同的东西,它不会返回 null。这就是我回答中代码的重点。您尝试过这个解决方案了吗?
    • 嗯,我知道了,谢谢,我明天试试,通知你
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2013-06-27
    • 2020-06-19
    相关资源
    最近更新 更多