2012-06-05 11 views
20

Возможно ли разбить один метод класса Java?Как издеваться над одним методом в java

Например:

class A { 
    long method1(); 
    String method2(); 
    int method3(); 
} 


// in some other class 
class B { 
    void someMethod(A a) { 
     // how would I mock A.method1(...) such that a.method1() returns a value of my 
     // choosing; 
     // whilst leaving a.method2() and a.method3() untouched. 
    } 
} 

ответ

45

Используйте Mockito's механизм шпиона:

A a = new A(); 
A aSpy = Mockito.spy(a); 
Mockito.when(aSpy.method1()).thenReturn(5l); 

Использование шпиона вызывает поведение по умолчанию обернутого объекта для любого метода, который не погасил.

Mockito.spy()/@Spy

+16

Или, как задокументировано, [в некоторых случаях] (http://mockito.googlecode.com/svn/branches/1.7/javadoc/org/mockito/Mockito.html#doReturn (java.lang.Object)), вы 'd need 'Mockito.doReturn (51) .when (aSpy) .method1();'. – Arjan

+0

как раз так. cheers –

+0

К сожалению, вы не можете следить за экземпляром последнего класса таким образом. :( –

1

Предполагая, что вы используете JMockit:

public void testCase(@Mocked("methodToBeMocked") final ClassBoBeMocked mockedInstance) { 
      new Expectations() {{ 
        mockedInstance.methodToBeMocked(someParameter); returns(whateverYouLikeItToReturn); 
      }} 

    mockedInstance.callSomemethod(); 
} 
6

Используйте spy() method from Mockito и издеваться свой метод так:

import static org.mockito.Mockito.*; 

... 

A a = spy(new A()); 
when(a.method1()).thenReturn(10L); 
-2

Вы можете просто создать подкласс A что переопределяет method1().

+0

Это не сработает - так как вам нужно будет передать существующий экземпляр A в подкласс A для того, чтобы подкласс для возврата a.method2() и a.method3() для вызовов метода2() и method3() соответственно. Это означает, что подкласс будет иметь метод override2() и method3(). – auser

+0

@ user63904: ah, поэтому вы хотите для изменения поведения метода1 INSIDE someMethod(), продолжая работать с экземпляром A, который был передан как параметр? Правильно, это не сработает. –

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