манипулировать приватным полем и обращаться к приватному методу с помощью powermockito - PullRequest
0 голосов
/ 24 октября 2018

У меня есть частное логическое поле, которое я пытаюсь установить в true, устанавливая его внутреннее состояние с помощью power mockito или с помощью частного установщика, но ни одно из них не работает.Я положил операторы печати в логику, чтобы проверить переменную.я вижу, что в моем предыдущем классе ему присваивается значение true, но как только тест проверяет оператор, использующий приватное поле, он становится ложным.Может кто-нибудь объяснить, что я делаю не так?

SQLJConnectionBase spy = PowerMockito.spy( new SQLJConnectionBase());
System.out.println("current internal state - " + Whitebox.getInternalState(spy, "isJUnitTestCase"));
PowerMockito.doReturn(true).when(spy, "isJUnitTestCase");
Whitebox.setInternalState(spy, "isJUnitTestCase", true);
System.out.println("new internal state - " + Whitebox.getInternalState(spy, "isJUnitTestCase"));

консольный вывод операторов печати в тестовом классе до и после манипуляции с закрытым полем в методе beforeclass

current internal state - false
new internal state - true

Консольный вывод операторов печати в классе, тестируемом в методе с использованием закрытого метода и закрытой переменной

variable state - false
method call variable state - false

, как вы можете видеть, isJUnitTest устанавливается в true в предклассе, но когда тестовый примерфактически использует его, isJUnitTest является ложным.

Это мои аннотации на тестовом классе

@PowerMockIgnore("javax.management.*")
@RunWith(PowerMockRunner.class)
@PrepareForTest({SQLJConnectionBase.class})

есть идеи?

1 Ответ

0 голосов
/ 24 октября 2018

Является ли isJUnitTestCase на самом деле именем поля?Похоже, что вы, возможно, указали имя метода установщика, но вам нужно будет указать имя поля для любого поля, которое устанавливает метод isJUnitTestCase.

См. https://github.com/powermock/powermock/wiki/Bypass-Encapsulation для примера.

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

...