2016-07-19 3 views
2

Я насмешливо массив интерфейс, который бросает java.lang.IllegalArgumentException: Cannot subclass final class class.Как издеваются массив интерфейсов, использующих powermock или Mockito

Ниже приведены изменения, которые я сделал.

Добавлены следующие аннотации на уровне класса в указанном порядке:

@Runwith(PowerMockRunner.class) 
@PrepareForTest({ Array1[].class, Array2[].class }) 

Внутри класса я делаю так:

Array1[] test1= PowerMockito.mock(Array1[].class); 
Array2[] test2= PowerMockito.mock(Array2[].class); 

и внутри метода испытаний:

Mockito.when(staticclass.somemethod()).thenReturn(test1); 
Mockito.when(staticclass.somediffmethod()).thenReturn(test2); 

В основном мне нужно издеваться над массивом интерфейсов. Любая помощь будет оценена по достоинству.

+0

Кто и какой тип 'staticclass'? Было ли это издевательством? Было бы полезно, если бы вы могли предоставить [SSCCE] (http://sscce.org) – Morfic

ответ

4

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

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

Когда ваш «класс под тестированием» должен иметь дело с каким-либо массивом, списком, картой, независимо от того, вы предоставите массив, список или карту для него - вы просто убедитесь, что элементы внутри этого массива/коллекция ... как они вам нужны. Может быть, массив пуст для одного теста, может быть, он содержит null для другого теста, и, возможно, он содержит издевательский объект для третьего теста.

Значение - вы не делаете:

SomeInterface[] test1 = PowerMock.mock() ... 

Вместо этого сделать:

SomeInterface[] test1 = new SomeInterface[] { PowerMock.mock(SomeInterface.class) }; 

И позволяют некоторые замечания:

  • По крайней мере, в вашем коде, это выглядит как вы назвали ваш интерфейс «Array1» и «Array2». Это очень вводит в заблуждение. Дайте имена интерфейсов, которые говорят, что их поведение. Тот факт, что вы позже создаете массивы, содержащие объекты этого интерфейса ... не имеет значения!
  • Если у вас нет веских причин - рассмотрите не с использованием PowerMock. PowerMock опирается на манипуляции с байтовым кодом; и может просто вызвать массу проблем. В большинстве ситуаций люди писали untestable код; и затем они обращаются к PowerMock, чтобы как-то проверить это. Но правильный ответ заключается в том, чтобы переделать этот сломанный дизайн и использовать издевательскую структуру, которая не имеет «власти» в ее имени. Вы можете посмотреть эти videos, давая вам длительные объяснения, как написать тестовый код!
+0

Спасибо за ответ из-за некоторых ограничений, которые я назвал array1 и array2 для intefaces.Sorry для этого. Теперь моя проблема решена путем преобразования массива в список и издевательства над интерфейсом списка. Я пробовал, как вы сказали, начиная с SomeInterface [] test1 = new SomeInterface [] {PowerMock.mock (SomeInterface.class)}; это не сработало и продолжало бросать то же исключение Thats, почему попросил предложение. Спасибо за ваши данные. – Pradeep

+0

Возможно, вы пытаетесь переработать весь свой вопрос; Я понятия не имею, что вы делаете. И ** снова **: вы делаете ** НЕ ** издеваетесь над объектом списка. Вы создаете объекты списка общего сада; вы только издеваетесь над объектами, которые вы вставляете в этот список. Короче говоря: лучше обратиться в справочный центр; и вы читаете, как задавать вопросы «мой код не работает». На данный момент: вы ** не ** предоставляете данные, которые нам нужны, чтобы помочь вам. Как вы теперь упоминаете исключения ... если да: отправляйте сообщения об исключениях и трассировки стека. – GhostCat

+0

Извините. Ваш ответ действительно был полезным. Я забыл принять. Спасибо за напоминание. Примите ваш ответ. – Pradeep