2014-11-24 4 views
1

Я использую PowerMock с EasyMock и задаюсь вопросом, как я могу издеваться над одиночным конструктором с частным конструктором?PowerMock - Mock a Singleton с частным конструктором

Скажем, у меня есть следующий класс:

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

Кто-нибудь знает, что я не хватает?

ответ

0

К сожалению, я не думаю, что это возможно для Android - см this answer.

Если вы не на Android, это выглядит как this, как вы это делаете.

0

Я не думаю, что вы должны подавлять конструктор, а дразнить его:

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

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

+0

Спасибо, но как я могу создать 'mockObject' для возврата? Это не требует вызова 'createMock'? – Jack

+1

Вы должны быть в состоянии использовать вызов #createMock(), как описано выше –

+0

Это бросает исключение в вопросе :( – Jack

Смежные вопросы