【问题标题】:PowerMock - Mock a Singleton with a Private ConstructorPowerMock - 使用私有构造函数模拟单例
【发布时间】:2014-11-24 15:24:21
【问题描述】:

我将 PowerMock 与 EasyMock 一起使用,想知道如何使用私有构造函数模拟单例?

假设我有以下课程:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() { }

    public static Singleton getInstance() {
        return singleton;
    }

    public int crazyServerStuff() { ... }
}

还有一个使用这个的类:

public class Thing {
    public Thing() {}

    public int doStuff(Singleton s) {
        return s.crazyServerStuff() + 42;
    }
}

如何模拟crazyServerStuff 方法?

我尝试了以下方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Singleton.class)
public class ThingTest extends AndroidTestCase {
    @Test
    public void testDoStuff() {
        MemberModifier.suppress(MemberModifier.constructor(Singleton.class));
        Singleton mockSingleton = PowerMock.createMock(Singleton.class);

        ...
    }
}

但我收到错误java.lang.IllegalArgumentException: No visible constructors in class Singleton

有人知道我错过了什么吗?

【问题讨论】:

    标签: java unit-testing singleton powermock easymock


    【解决方案1】:

    我认为你不应该压制构造函数,而是模拟它:

    PowerMock.expectNew(Singleton.class).andReturn(mockObject)
    

    https://code.google.com/p/powermock/wiki/MockConstructor

    【讨论】:

    • 谢谢,但是我如何创建mockObject 来返回?这不需要调用createMock吗?
    • 您应该可以像上面那样使用#createMock() 调用
    • 这会引发问题中的异常:(
    • 尝试添加您的测试类来准备注释:@PrepareForTest({Singleton.class, ThingTest.class})
    • 我仍然得到异常。感谢您查看这个!您还有其他想法吗?
    【解决方案2】:

    遗憾的是,我认为这对于 Android 来说是不可能的 - 请参阅 this answer。

    如果您不在 Android 上,看起来this 就是您的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      相关资源
      最近更新 更多