2014-08-31 8 views
10

Я пытаюсь высмеять частный статический метод anotherMethod(). Смотрите ниже кодКак я могу издеваться над частным статическим методом с PowerMockito?

public class Util { 
    public static String method(){ 
     return anotherMethod(); 
    } 

    private static String anotherMethod() { 
     throw new RuntimeException(); // logic was replaced with exception. 
    } 
} 

Вот это мне тестовый код

@PrepareForTest(Util.class) 
public class UtilTest extends PowerMockTestCase { 

     @Test 
     public void should_prevent_invoking_of_private_method_but_return_result_of_it() throws Exception { 

      PowerMockito.mockStatic(Util.class); 
      PowerMockito.when(Util.class, "anotherMethod").thenReturn("abc"); 

      String retrieved = Util.method(); 

      assertNotNull(retrieved); 
      assertEquals(retrieved, "abc"); 
     }  
} 

Но каждая плитка я запускаю его я получаю это исключение

java.lang.AssertionError: expected object to not be null 

Я полагаю, что я делаю что-то неправильно с насмешливым вещи. Любые идеи, как я могу это исправить?

ответ

23

К этому вы можете использовать PowerMockito.spy(...) и PowerMockito.doReturn(...). Кроме того, вы должны указать PowerMock бегуна на тестовый классе, а именно:

@PrepareForTest(Util.class) 
@RunWith(PowerMockRunner.class) 
public class UtilTest { 

    @Test 
    public void testMethod() throws Exception { 
     PowerMockito.spy(Util.class); 
     PowerMockito.doReturn("abc").when(Util.class, "anotherMethod"); 

     String retrieved = Util.method(); 

     Assert.assertNotNull(retrieved); 
     Assert.assertEquals(retrieved, "abc"); 
    } 
} 

Надеется, что это помогает.

-1

Я не уверен, какая версия PowerMock вы используете, но с более поздней версии, вы должны использовать @RunWith(PowerMockRunner.class) @PrepareForTest(Util.class)

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

+0

No. Для 'TestNG' мне нужно использовать мои аннотации. – Aaron

4

Если anotherMethod() принимает любой аргумент anotherMethod (параметр), правильный вызов метода будет:

PowerMockito.doReturn("abc").when(Util.class, "anotherMethod", parameter); 
Смежные вопросы