【问题标题】:createMock and non-abstract methods in an abstract class抽象类中的 createMock 和非抽象方法
【发布时间】:2013-04-04 03:59:21
【问题描述】:

我有一个 abstract 类,我想模拟出来用于测试目的:

public abstract class Foo {
    public abstract void bar();
    public void baz() {
      System.out.print("Hi from baz!");
    }
}

如果我使用easyMock Foo mock = createNiceMock(Foo.class) 然后调用mock.baz() 我得到一个java.lang.NullPointerException。如果我将baz() 更改为final,事情就会顺利进行(我认为这与EasyMock 无法模拟final 方法的事实有关)但我希望能够在不这样做的情况下调用baz()

有没有办法使用 EasyMock 创建一个模拟对象,允许我调用我的非abstract 方法?

我目前使用的一种解决方法是:

Foo mock = new Foo() {
    @Override
    public void bar() {
        return;
    }
}

但这太丑了。

【问题讨论】:

    标签: java easymock


    【解决方案1】:

    所以我找到了解决问题的方法。您可以在 EasyMock 中创建部分模拟:

    Foo mock = EasyMock.createMockBuilder(Foo.class) 
                    .addMockedMethod("bar")
                    .createNiceMock();
    

    对此的一个警告是,如果类有实例变量,因为您没有使用new,它们将不会被初始化!如果有人对此方面有解决方法,那将很有用。那就是为这个类创建一个部分:

    public abstract class Foo {
        public double myInstanceVariable = 2;
        public abstract void bar();
        public void baz() {
          System.out.print("Hi from baz!");
        }
    }
    

    在哪里可以致电mock.myInstanceVariable 并获得2

    【讨论】:

    • 关于您的解决方法,您可以只设置字段... Field field = Foo.class.getDeclaredField(fieldName); field.setAccessible(true); field.set(setFieldOn, value);
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-09-21
    • 2016-12-05
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多