2016-09-28 4 views
0

Я пытаюсь издеваться следующий класс, который содержит некоторые статические членыPowermock - насмехаясь статические члены класса

public class ClientFact { 

    private static final String BASE_URL = Config.getProperty("prop1"); 
    private static final String USERID = Config.getProperty("prop2"); 

    ...................... 

    public static Client createClient() throws AppException { 

    } 

} 

, но я бегу в проблемы с статические переменные-члены, которые заселенных Config.getProperty. Этот класс делает чтение из файла свойств, как так

public class Config { 

............... 

    public static String getProperty(Param param) { 
     String value = null; 
     if (param != null) { 
     value = properties.getProperty(param.toString()); 
     } 
     return value; 
    } 
} 

Я пытаюсь издеваться этот вызов, так как я не забочусь о загруженных свойств в моем тесте. Это то, что ив пытался

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClientFact.class}) 

public class MyTests { 


    @Test 
    public void test() { 

     PowerMock.mockStaticPartial(Config.class, "getProperty"); 
EasyMock.expect(Config.getProperty(EasyMock.anyObject())).andReturn(EasyMock.anyString()).anyTimes(); 

    PowerMock.mockStatic(ClientFact.class); 

    } 


} 

но его дает следующее сообщение об ошибке ...

java.lang.NoSuchMethodError: org/easymock/internal/MocksControl.createMock(Ljava/lang/Class;[Ljava/lang/reflect/Method;)Ljava/lang/Object; 
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2214) 
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163) 

любые идеи, что им doign здесь не так?

+0

Звучит как конфликтующие версии зависимостей, проверьте свои зависимости –

ответ

1

Ответ: не принимайте статические звонки туда.

Вы видите, что непосредственно связывает этот класс с реализацией этого статического метода в каком-то другом классе; по-настоящему. (И для записи: это кажется странным, что USER_ID Строкой является статического поля в классе ClientFact Вы действительно намерены что все ClientFacts используют один и тот же USER_ID ?!.)

Вы могли бы заменить, что статические вызов с нестатической версией (например, путем введения интерфейса); и затем вы можете использовать зависимую инъекцию, чтобы сделать экземпляр этого интерфейса доступным для вашего тестируемого класса. И тогда все ваши тестовые работы без необходимо для Powermock.

Краткая история: очень часто (но не всегда!) Необходимость обращения к Powermock происходит в производственном коде, который не был написан для проверки (например, в вашем случае). Таким образом, вместо того, чтобы использовать большой плохой молот Powermock для «исправления» вашей проблемы с тестированием, вам следует рассмотреть возможность улучшения вашего производственного кода.

Возможно, вы захотите послушать этих videos, чтобы лучше понять, о чем я говорю.

+0

спасибо за ссылки ... его устаревший код :) ... так что я застрял в нем тем временем ... так что с идеей inteface я бы обернул Класс Config в новой реализации и перейти к createClient .... это то, что вы имеете в виду? – blu10

+0

Да. Но, конечно, если вы не можете (или не хотите) изменить этот код, то да, Powermock - жизнеспособная альтернатива; и должно быть возможно заставить его делать то, что вам нужно. В этом случае я предлагаю сделать некоторые поиски; и глядя на примеры ;-) – GhostCat

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