如何覆盖方法内部的对象创建?

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
}

最佳答案

简单地说:这是行不通的。

您不能模拟对new的调用(使用EasyMock。但是可以使用PowerMock(ito)或JMockit之类的框架)。

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

更准确地说:如果您的类确实不需要任何其他对象来工作,那么测试将更像

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


换句话说:为了测试您的课程,您只需实例化它;然后调用它的方法;然后使用断言检查其预期状态。

请参阅here,以获得关于我正在谈论的内容的出色(尽管有些冗长)的解释。

10-06 02:05