EasyMock - 覆盖对象创建

时间:2016-07-04 08:56:19

标签: java unit-testing junit easymock

如何在方法中覆盖对象创建?

public class ClassToTest {
    public Object testMethod() {
        ... code ...
        Object result;
        try {
            result = new ClassToMock(someParam).execute();
        } catch (Exception e) {
            // handle error
        }

        return result;
    }
}

我的测试如何覆盖ClassToMock的“execute”方法?我很乐意使用EasyMock进行代码示例。我想测试“testMethod”,例如:

@Test
public void testMethodTest(){
    ClassToTest tested = new ClassToTest();
    // Mock ClassToMock somehow
    tested.testMethod();
    // Verify results
}

3 个答案:

答案 0 :(得分:3)

简单地说:那不起作用。

您无法模拟对 new 的调用(使用EasyMock。虽然可以使用PowerMock(ito)或JMockit等框架)。

但更好的方法是:使用依赖注入,以便将已创建的对象传递到您正在测试的类中。

更确切地说:如果你的班级真的不需要任何其他对象,那么测试会更像是

 @Test
 public void testFoo() {
    ClassToTest underTest = new ClassToTest(...)
    underTest.methodToTest();
    assertThat( ... )

换句话说:为了测试你的类,你只需要实例化它;然后你调用它的方法;并使用断言来检查它的预期状态。

请参阅here,了解我正在谈论的内容(但有点冗长)。

答案 1 :(得分:1)

如果类的方法未标记为final

,则只能覆盖方法
try {
    ClassToMock mock = new ClassToMock(someParam){
        public Object execute(){ //Such that your method is public
            //If you want to call back to the pure method
            //super.execute()

            //Do override things here
        }
    };
    result = mock.execute();
} catch (Exception e) {
    // handle error
}

答案 2 :(得分:-1)

Powermock可以实现。使用powermock,你可以模拟新的'运营商也是

{{1}}

有关详细信息,请参阅此link