2016-06-27 5 views
1

Я пытаюсь использовать PowerMockito для создания шпиона класса final, но я продолжаю получать следующую ошибку, хотя я использую метод PowerMockito spy() вместо Mockito's :Не могу издеваться над финальным классом с помощью PowerMockito.spy()

java.lang.IllegalArgumentException: Невозможно создать подкласс конечный класс класс com.whoever.WidgetUploadClient

Мой тестовый пример выглядит примерно так:

... 
import static org.powermock.api.mockito.PowerMockito.mock; 
import static org.powermock.api.mockito.PowerMockito.spy; 

@RunWith(PowerMockRunner.class) 
@PowerMockRunnerDelegate(RobolectricTestRunner.class) 
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) 
@PrepareForTest(WidgetUploadClient.class) 
@Config(manifest=Config.NONE, sdk = 23) 
public class WidgetUploadClientTest { 
    @Test 
    public void testUploadWidget() { 
     WidgetMarshaller mockMarshaller = mock(WidgetMarshaller.class); 
     WidgetUploadClient client = spy(new WidgetUploadClient(mockMarshaller)); // Exception thrown by spy() 
     ... 
    } 
} 

Не должно быть @PrepareForTest(WidgetUploadClient.class) и с использованием учетной записи метода PowerMockito spy() для WidgetUploadClient является окончательным?

Я также попробовал альтернативный подход нашел в Robolectric-х PowerMock guide: с помощью RobolectricTestRunner или RobolectricGradleTestRunner в качестве тест бегун (@RunWith) с @Rule public PowerMockRule rule = new PowerMockRule(). Когда я это делаю, тест не запускается полностью, и возникает другое исключение.

Я использую PowerMock/PowerMockito 1.6.5, Robolectric 3.1 и Java 1.8.0_91-b14.

ответ

0

Я считаю, что я использую API, правильно, но я испытываю ошибкой, что разработчики эффектов пытаются использовать комбинацию Robolectric и PowerMock. Для справки, ошибка может быть отслежена на Robolectric's issue tracker. Сочетание библиотек было нарушено с по крайней мере в январе 2016 года (в настоящее время ~ 6 месяцев назад.)

0

Чтобы получить эту работу, вы должны понять, что делает аннотацию @PrepareForTest и сделать небольшие изменения в вашем коде:

аннотацию в используемых, чтобы понять, какой класс мы собираемся проверить и подготовить этот класс mock static, final и т. д. и т. д. (так что методы, которые обычно не являются макетными с mockito), как обычные методы.

После того, что вы должны сделать это в коде:

WidgetMarshaller mockMarshaller = mock(WidgetMarshaller.class); 
//Here you are doing correcly the mocking of the object 

WidgetUploadClient client = new WidgetUploadClient(mockMarshaller); 
//Here you have to add this line to create an object that will be spied 

client = PowerMockito.spy(client); 
//Here you simply spy your class 

Кстати, есть еще одна вещь, чтобы помнить, если вы передаете

@PrepareForTest(WidgetUploadClient.class) 

к классу, вы сможете mock или spy просто класс WidgetUploadClient, поэтому вам нужно передать два (или если хотите больше) параметров в класс с использованием массива в качестве параметра аннотации, просто напишите это

@PrepareForTest({WidgetUploadClient.class, WidgetMarshaller.class}) 

Надеется, что вы получите это работает: D Увидится

+0

Спасибо за ваш отзыв, Claudio. Это хороший пример использования PowerMock. Хотя, я считаю, что правильно использую PowerMock, если в моем примере не было неправильного использования, которое вы можете указать. Я считаю, что настоящая проблема заключается в использовании PowerMock специально с Robolectric. Из того, что я нашел в Интернете, я считаю, что моя проблема - ошибка в Robolectric. – spaaarky21

+0

@ spaaarky21 Пробовал ли вы передать массив в аннотацию «PrepareForTest», как я предлагаю в своем примере? –

+0

Это хорошая вещь, но я считаю, что только «WidgetUploadClient» должен быть подготовлен, так как это единственный «последний», в отличие от «WidgetMarshaller». – spaaarky21

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