【问题标题】:EasyMock: Partially mocked classEasyMock:部分模拟类
【发布时间】:2013-10-15 16:05:48
【问题描述】:

所有未在模拟类上模拟的方法都正常工作吗?

E.G.

给定对象

public class Shape {
    public void createShape(...){
        ....
    }

    public void removeShape(...){
        ....
    }

    ...
}

如果这被嘲笑为

shape = createMock(Shape.class, new Method[]{Shape.class.getMethod("removeShape", new Class[]{...})});

createShape() 这样的所有其他方法会起作用吗,还是必须模拟出所有要使用的方法?

【问题讨论】:

  • 为什么不试试呢?
  • 我已经尝试过类似的方法,但它看起来不像所有其他方法都有效,但因为我只是在学习 easymock 框架,我不确定是否有可能以另一种方式做到这一点,或者我是否有在我的示例中做了一些不正确的事情

标签: java unit-testing easymock


【解决方案1】:

简而言之,是的。

Partial Mocks 的工作方式与模拟类的实例完全相同,但它们能够为您设置为模拟的方法添加期望。 当您有一个也依赖于该方法的超类实现的覆盖方法时,这通常很有帮助。

您的示例似乎使用了已弃用的 createMock(Class, Method...) 方法,因此我将提供一个示例,说明您应该如何为 Shape 类创建部分模拟。

final IMockBuilder<Shape> mockBuilder = EasyMock.createMockBuilder(Shape.class);
mockBuilder.addMockedMethod(Shape.class.getMethod("removeShape", new Class[]{...}));
final Shape mockShape = mockBuilder.createMock();

这将提供一个行为正常的 Shape 对象,直到它尝试使用 removeShape 方法,它需要对行为有一些期望。

就个人而言,我很少使用带有 Method 参数的 addMockedMethod 版本。通常,我要模拟的方法足够独特,可以使用 addMockedMethod(String) 版本。所以我很可能会使用以下内容:

final IMockBuilder<Shape> mockBuilder = EasyMock.createMockBuilder(Shape.class);
mockBuilder.addMockedMethod("removeShape");
final Shape mockShape = mockBuilder.createMock();

这对我的眼睛来说更干净一些,并且达到了相同的效果。

但请记住,这些部分模拟与完全模拟遵循相同的规律。 所以你不能像这样模拟 final 方法。

希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多