Odpowiedź z @edutesoy punktów w dokumentacji PowerMockito i wspomina konstruktor wyśmianie jako wskazówka, ale nie wspomina, jak zastosować to do obecnego problemu w pytaniu.
Oto rozwiązanie oparte na tym.Biorąc kod z pytaniem:
public class MyClass {
void method1{
MyObject obj1=new MyObject();
obj1.method1();
}
}
Poniższy test tworzenia makiety klasy instancji myObject poprzez przygotowanie klasy, która tworzy wystąpienie go (w tym przykładzie Wołam go MojaKlasa) z PowerMock i pozwalając PowerMockito do odgałęzienie konstruktor klasy MyObject, a potem pozwalając skrótową z MyObject instancja method1() połączenia:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MyClassTest {
@Test
public void testMethod1() {
MyObject myObjectMock = mock(MyObject.class);
when(myObjectMock.method1()).thenReturn(<whatever you want to return>);
PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock);
MyClass objectTested = new MyClass();
objectTested.method1();
... // your assertions or verification here
}
}
Mając to Twój wewnętrzny method1() wywołanie zwróci to, co chcesz.
Jeśli lubisz jednej wkładki można uczynić kod krótszym tworząc makiety i inline skrótowe:
MyObject myObjectMock = when(mock(MyObject.class).method1()).thenReturn(<whatever you want>).getMock();
Uwaga, ale do wykorzystania w przyszłości będę używał PowerMock – Xoke
@edutesoy Czy możesz napisać pełny kod? Nie mogę zrozumieć twojego pomysłu. Nie widzę związku między szyderstwem konstruktora a lokalnymi kpiączkami zmiennymi. – gstackoverflow
Problem z tym podejściem, jeśli używam EclEmma do pokrycia kodu jest to, że EclEmma zapewnia 0% pokrycie kodu dla MyClass, jeśli dodaję MyClass.class do @PrepareForTest zamiast rzeczywistego zasięgu kodu. Myślę, że jest to ograniczenie lub błąd w narzędziu EclEmma. Jakiś pomysł na rozwiązanie tego problemu? –