2011-09-01 6 views
0

Я хочу проверить статический метод A, который вызывает другой статический метод B в том же классе. Как я могу макетировать метод B?Как издеваться над статическим методом, который вызывается другим статическим методом?

+0

У меня есть тест он с Mockito, EasyMock.expect, PowerMock.mockStatic, PowerMock.replay и PowerMockito. Но не работает. – Tommy

+2

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

+1

Питер: Спасибо за ваш совет. Но я не могу изменить дизайн. :-( – Tommy

ответ

0

Если обе функции находятся в одном классе, то звоните просто без использования какого-либо объекта или имени класса. Если они находятся в разных функциях, то с помощью имени класса вы можете позвонить друг другу. Надеюсь, это вам поможет. :)

1

Дразнящий статические методы Краткое резюме

Use the @RunWith(PowerMockRunner.class) annotation at the class-level of the test case. 
Use the @PrepareForTest(ClassThatContainsStaticMethod.class) annotation at the class-level of the test case. 
Use PowerMock.mockStatic(ClassThatContainsStaticMethod.class) to mock all methods of this class. 
Use PowerMock.replay(ClassThatContainsStaticMethod.class) to change the class to replay mode. 
Use PowerMock.verify(ClassThatContainsStaticMethod.class) to change the class to verify mode. 

Пример Дразнящий статический метод PowerMock требует использования метода «mockStatic» в PowerMock. Скажем, у вас есть класс, ServiceRegistrator с методом под названием registerService, который выглядит следующим образом:

public long registerService(Object service) { 
    final long id = IdGenerator.generateNewId(); 
    serviceRegistrations.put(id, service); 
    return id; 
} 

Достопримечательность здесь статический метод вызов IdGenerator.generateNewId(), которую мы хотели бы насмехаться. IdGenerator - это вспомогательный класс, который просто генерирует новый идентификатор службы. Это выглядит следующим образом:

public class IdGenerator { 

    /** 
    * @return A new ID based on the current time. 
    */ 
    public static long generateNewId() { 
     return System.currentTimeMillis(); 
    } 
} 

С PowerMock это можно ожидать вызов IdGenerator.generateNewId() так же, как вы бы с любым другим способом, используя EasyMock однажды вы сказали PowerMock подготовить класс IdGenerator для тестирования. Вы делаете это, добавляя аннотацию к классу тестового примера. Это просто делается с помощью @PrepareForTest (IdGenerator.class). Вам также необходимо сообщить JUnit выполнить тест с использованием PowerMock, который выполняется с помощью @RunWith (PowerMockRunner.class). Без этих двух аннотаций тест не удастся.

Фактическое испытание, то на самом деле довольно просто:

@Test 
public void testRegisterService() throws Exception { 
     long expectedId = 42; 

     // We create a new instance of test class under test as usually. 
     ServiceRegistartor tested = new ServiceRegistartor(); 

     // This is the way to tell PowerMock to mock all static methods of a 
     // given class 
     mockStatic(IdGenerator.class); 

     /* 
     * The static method call to IdGenerator.generateNewId() expectation. 
     * This is why we need PowerMock. 
     */ 
     expect(IdGenerator.generateNewId()).andReturn(expectedId); 

     // Note how we replay the class, not the instance! 
     replay(IdGenerator.class); 

     long actualId = tested.registerService(new Object()); 

     // Note how we verify the class, not the instance! 
     verify(IdGenerator.class); 

     // Assert that the ID is correct 
     assertEquals(expectedId, actualId); 
} 

Обратите внимание, что вы можете издеваться статические методы в классе, даже если класс является окончательным. Метод также может быть окончательным. Чтобы высмеять только определенные статические методы класса, обратитесь к частичной частичной части документации.

Reference: powermock wiki

+1

Oleksandr: Спасибо за ваш ответ. Если метод тестирован не является статическим методом, он работает. Но если метод является статическим методом и в классе IdGenerator, у вас будет проблемы. Как показано ниже: public класс IdGenerator { /** * @return новый идентификатор на основе текущего времени */ общественности статической долго generateNewId() { возврата System.currentTimeMillis();}. общественности статической долго registerService (обслуживание объекта) { final long id = IdGenerator.generateNewId(); //serviceRegistrations.put(id, service); return id; } } – Tommy

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