Насмешка над объектом внутри класса без PowerMock - PullRequest
0 голосов
/ 08 мая 2019

Я хочу смоделировать объект внутри класса без Powermock. Как я могу это сделать?

Я пытался использовать шпион, но это не сработало.

/** SOURCE CODE **/
abstract class Parent {
    protected final Caller caller = new Caller();
    public abstract void call(Connection, Integer);
}

class Child1 extends Parent {

    @Override
    public void call(Connection con, Integer id1) {
        // some logic
        caller.getSomething1(connection, id1);
    }
}

class Child2 extends Parent {

    @Override
    public void call(Connection con, Integer id2) {
        // some logic
        caller.getSomething2(connection, id2);
    }
}

class Activity {

     @Inject
     private MyConnection connection;

     public Response process(Request r) {
           Parent p = ChildFactory.getChild(r); // returns a child based on some logic related to p
           p.call(connection, r.getId());
           return new Response("SUCCESS");
     }
}

/** TEST CODE **/

public class Test {

    @InjectMocks
    private Activity activity;

    @Mock
    private Connection connectionMock;

    private Caller caller;

    @Before
    public void setup() throws Exception {
         caller = Mockito.spy(Caller.class);
Mockito.doReturn(null).when(caller).getSomething1(Mockito.any(), Mockito.any());
Mockito.doReturn(null).when(caller).getSomething2(Mockito.any(), Mockito.any());
    }

    @Test
    public void testProcess() {
        Request r = new Request(1);
        Response r = activity.process(r);
        Assert.assertEquals(r.getResult(), "SUCCESS"); 
    }
}

Я хочу смоделировать объект вызывающего, созданный в родительском классе. Это будет потребляться всеми детьми. Меня не беспокоит результат вызовов, поэтому я хочу смоделировать все вызовы (то есть getSomething1, getSomething2) вызывающих абонентов без использования PowerMock.

Я пытался использовать шпион, но он не использует шпионский объект и вызывает методы getSomething1 и getSomething2.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете использовать ReflectionTestUtils # setField

@Before
public void setup() throws Exception {
     caller = Mockito.spy(Caller.class);
     Mockito.doReturn(null).when(caller).getSomething1(Mockito.any(), Mockito.any());
     Mockito.doReturn(null).when(caller).getSomething2(Mockito.any(), Mockito.any());

     // ... obtain children here ...

     ReflectionTestUtils.setField(child1, "caller", caller);
     ReflectionTestUtils.setField(child2, "caller", caller);
}

Или лучше не создавать экземпляр Caller экземпляра внутри Child -классов, а внедрять через конструктор, например

...