Как издеваться над частным статическим внутренним классом с помощью Powermock

#junit #mockito #powermock

#junit #mockito #powermock

Вопрос:

Я новичок в mockito powermock. Я пытаюсь издеваться над классом, который имеет частный статический внутренний класс. Я сталкиваюсь с ошибкой ExceptionInInitializerError. Не мог бы кто-нибудь, пожалуйста, помочь мне правильно инициализировать класс.

Ошибка:

 java.lang.ExceptionInInitializerError
    at sun.reflect.GeneratedSerializationConstructorAccessor9.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    ....................
    ....................
Caused by: java.lang.NullPointerException
    at com.ibm.retail.xpd.pos.messaging.topics.TopicComponentHelper.<init>(TopicComponentHelper.java:10)
    at com.ibm.retail.xpd.pos.messaging.topics.NodePath.<init>(NodePath.java:11)
    at com.ibm.retail.xpd.pos.messaging.service.RetailPlatformService.<init>(RetailPlatformService.java:69)
    at com.tgcs.scrt.gui.components.PageManager$PageControlService.<init>(PageManager.java:216)
    at com.tgcs.scrt.gui.components.PageManager.<clinit>(PageManager.java:242)
    ... 69 more
  

Класс выглядит так:

 public class PageManager{
    .........
    .........
    private static class PageControlService extends PlateFormService{
    .........
    }
}
  

Макет класса в тестовом примере:

 PowerMockito.mockStatic( PageManager.class );
  

Ответ №1:

Похоже, вам не хватает:

Используйте @RunWith(PowerMockRunner.class ) аннотация на уровне класса тестового примера. Используйте @PrepareForTest(ClassThatContainsStaticMethod.class ) аннотация на уровне класса тестового примера.

От:

https://github.com/jayway/powermock/wiki/MockStatic

@Marcin — какой ужасный, снисходительный ответ. Вам часто нужно издеваться над статическими классами. Например, в клиенте riak от basho класс response является статическим внутренним классом (что, исходя из их POV, имеет смысл — только клиент должен создавать ответы). Итак, если вы хотите издеваться над тем, что возвращает клиент, вам нужно издеваться над статическим внутренним классом.

Очень устал от всех людей, отвечающих на вопросы модульного теста словами «не издевайтесь над X» или «этот код, который вы тестируете, неверен», просто потому, что они не знают ответа.

Комментарии:

1. 1 за «Очень устал от …». Большинство из нас здесь знают, как реальные компании справляются с модульным тестированием, и как нам приходится создавать модульные тесты с кодом, который нельзя реорганизовать, поэтому, видя все эти «Это ужасная идея», «Вы не понимаете сути UnitОтветы на тесты совершенно ужасны и скучны.

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