Как полностью смоделировать класс с помощью PowerMockito?

Я читаю эту документацию по PowerMockito, и в ней есть два основных примера:

  1. Имитация статических методов
  2. Частично издевательство над классом

но я хочу знать, как издеваться над всем классом, созданным с помощью new. Я ищу версию метода mock Mockito для PowerMockito. Это должно каким-то образом заменить new Foo() в моем производственном коде на Mockito mock(Foo.class). Вот что я пробовал:

import com.PowerMockitoProduction;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.mockito.Matchers.any;
import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(PowerMockRunner.class)
@PrepareForTest(PowerMockitoProduction.class)
public class PowerMockitoTest {

    @Test(expected = UnsupportedOperationException.class)
    public void test() throws Exception {

        HttpClient mock = PowerMockito.mock(HttpClient.class);
        when(mock.executeMethod(any(HttpMethod.class))).thenThrow(UnsupportedOperationException.class);

        new PowerMockitoProduction().createClient();

    }
}

Этот тест терпит неудачу с этим:

java.lang.Exception: Unexpected exception, expected<java.lang.UnsupportedOperationException> but was<java.lang.IllegalArgumentException>

Вот мой производственный код:

package com;

import org.apache.commons.httpclient.HttpClient;

import java.io.IOException;


public class PowerMockitoProduction {

    public void createClient() throws IOException {
        HttpClient client = new HttpClient();
        client.executeMethod(null);
        System.out.println(client);
    }

}

С моим отладчиком я вижу, что client не макет, как я ожидал.

Я также пытался использовать:

Object mock = PowerMockito.whenNew(HttpClient.class).withNoArguments().getMock();

Но по какой-то причине это возвращает макет, который не полностью построен. Я также пробовал это:

HttpClient mock = PowerMockito.whenNew(HttpClient.class).withNoArguments().thenReturn(mock(HttpClient.class)).getMock();

Но это дает мне ClassCastException в этой строке. Итак, как правильно полностью смоделировать класс с помощью PowerMockito?

В отличие от этого примера, причина, по которой я пытаюсь смоделировать HttpClient, заключается в том, что я могу вызвать его verify позже.


person Daniel Kaplan    schedule 23.02.2015    source источник
comment
Что вы подразумеваете под полным издевательством над классом. Извините, я пару раз просмотрел ваш вопрос, но не смог понять эту часть.   -  person Rohit Jain    schedule 23.02.2015
comment
@RohitJain Я ищу версию метода mock Mockito для PowerMockito.   -  person Daniel Kaplan    schedule 23.02.2015
comment
Вам не нужно вызывать метод getMock() после thenReturn().   -  person Rohit Jain    schedule 23.02.2015
comment
@RohitJain хорошо, thenReturn не возвращает HttpClient. Я хочу verify на макете.   -  person Daniel Kaplan    schedule 23.02.2015


Ответы (1)


Вам не нужно вызывать метод getMock(), чтобы вернуть издевательский объект. По сути, смоделируйте экземпляр HttpClient, сохраните его в локальной переменной и используйте это:

@Test(expected=UnsupportedOperationException.class)
public void test() {
    HttpClient httpClient = mock(HttpClient.class);
    PowerMockito.whenNew(HttpClient.class).withNoArguments().thenReturn(httpClient);
    when(httpClient.executeMethod(any(HttpMethod.class))).thenThrow(UnsupportedOperationException.class);

    new PowerMockitoProduction().createClient();
    verify(httpClient).executeMethod(null);
}
person Rohit Jain    schedule 23.02.2015
comment
Вы должны так поступать? Кажется немного запутанным. - person Daniel Kaplan; 23.02.2015
comment
Да. Вы должны иметь издевательский экземпляр, хранящийся как локальная переменная или переменная экземпляра, и использовать его повсюду. - person Rohit Jain; 23.02.2015