PowerMock - 使用私有构造函数模拟Singleton

时间:2014-11-24 15:24:21

标签: java unit-testing singleton powermock easymock

我正在使用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

有谁知道我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

可悲的是,我认为这不适用于Android - 请参阅this answer

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