【问题标题】:EasyMock - override an object creationEasyMock - 覆盖对象创建
【发布时间】:2016-07-04 08:56:18
【问题描述】:

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

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

        return result;
    }
}

我的测试如何覆盖 ClassToMock 的“执行”方法?我会很高兴使用 EasyMock 的代码示例。我想测试“testMethod”,比如:

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

【问题讨论】:

  • 抱歉,为了生产截止日期夜以继日地工作......
  • 不必感到抱歉!有时人们只是忘记了问题已经得到回答并且可以被接受。我也发生过。

标签: java unit-testing junit easymock


【解决方案1】:

简单地说:那行不通。

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

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

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

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

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

请参阅here 以获得关于我所谈论内容的出色(虽然有点冗长)解释。

【讨论】:

    【解决方案2】:

    只有在类的方法没有标记为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
    }
    

    【讨论】:

    • 我想对“testMethod”做一个单元测试,那么什么时候调用呢? “testMethod”如何使用模拟对象而不是真实对象?对不起基本的东西。我是 Java 单元测试的初学者。
    • 可以使用JUnit,并在方法顶部添加@Test注解。
    • “testMethod”如何使用模拟对象而不是真实对象?
    • 我不知道mock objects
    • 或许你可以四处寻找答案
    【解决方案3】:

    Powermock 可以做到这一点。使用 powermock,您也可以模拟 'new' 运算符

    ClassToMock mock = PowerMock.createMock(ClassToMock.class);
    PowerMock.expectNew(ClassToMock.class, parameterValues).andReturn(mock);
    PowerMock.replayAll();
    

    更多详情请参考link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2020-08-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多