2013-03-19 4 views
1

Я издевался над частным методом с помощью PowerMock/Mockito, теперь мой вопрос здесь в том, как я могу получить доступ к объявленному внутри этого метода объекту?Как получить доступ к объекту внутри частного метода?

например.

private void method1() 
{ 
MyObject ob = new MyObject(); 

} 

сейчас в моем тестовом коде. Я хочу получить доступ к объекту ob для проверки значений.

+0

Я не уверен, но я помню, как способ поиздеваться вызов конструктора каким-то образом, и заставить его вернуться фиктивный объект, который может быть проверяется после этого – ppeterka

+1

Вы можете предоставить некоторые рекомендации о том, что вы пытаетесь выполнить. Поскольку мне кажется, что вы не используете правильный подход, если хотите проверить внутренние поля частного метода. – benzonico

+0

@ppeterka: Я не хочу изменять код – user2181531

ответ

1

This guide детали насмешливый вызов конструктора с помощью PowerMock:

... Но PowerMock вам не придется менять код, вместо этого вы можете поручить PowerMock перехватить вызов нового файла (. .) и вместо этого верните макет. Для этого мы начнем с создания издеваться типа File.class как обычно:

File fileMock = createMock(File.class); 

Ожидать вызов нового файла мы просто делаем:

expectNew(File.class, "directoryPath").andReturn(fileMock); 

Так что в вашем случае, вы должны иметь это в вашем тест случае или настройки метода:

MyObject mockOb = createMock(MyObject.class); 
expectNew(MyObject.class).andReturn(mockOb); 

добавив эти, вы будете иметь следующее поведение:

Всякий раз, когда есть new MyObject() в , ваш код, запущенный тестовым чеком, будет возвращен экземпляр объекта, издевавшийся над PowerMock. Так что неважно , где в вашем коде вы создаете новый экземпляр MyObject, он будет тем же самым, который создается функцией createMock().

EDIT

позволяет брать пример

Class A { 
private void method1() 
{ 
    Obj obj = new Obj(); 
    obj.setX(10); 
} 
//Here I want to access the obj object to verify the values 
} 

Для достижения этой цели, вы должны думать немного по-другому.

  1. создать реальный Экземпляр
  2. создать насмешливый для Obj конструктора
  3. запуска вашей логики, которая запускает проверку pruivate method1()
  4. значения на издевались например Obj
    • если значения не проверяются (что-то модифицирует его в логике), zou может проверить, вызвал ли setX() соответствующие времена.

Что-то вдоль этих линий:

@Test 
public void testMyPrivateMethod() { 
    //1. object with the logic to test 
    A a = new A(); 

    //2. set up mocking 
    Obj mockObj = createMock(Obj.class); 
    expectNew(Obj.class).andReturn(mockObj); 

    //3. trigger logic to test 
    a.someOtherMethodThatCallsMethod1(); 

    //4. test Obj (find out if setX() has been called or not) 
    verify(mockObj).setX(any(Integer.class)); 
} 
+0

Мой метод не возвращает тот же объект, который вы создаете, когда mocking – user2181531

+0

позволяет взять пример Class A {private void method1() {Obj obj = новый Obj(); obj.setX (10);} Здесь я хочу получить доступ к объекту obj для проверки значений. – user2181531

+0

Тип возврата вашего метода - 'void'. Он ничего не возвращает. Я не понимаю, что вы пишете ... Вы понимаете, как насмешливые работы? – ppeterka

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

  • Нет связанных вопросов^_^