Разница в поведении, когда отражение указано в PowerMock Accepting? - PullRequest
0 голосов
/ 19 апреля 2020

Я Java новичок.

Как вы можете видеть в исходном коде ниже, когда я искал образец кода класса URL Mock на net, бывают случаи, когда нет отражать и случаи, когда есть отражение. Чем отличается поведение в каждом случае?

Что означает блочное описание, например {String.class}?

URL mockedURL = PowerMockito.mock(URL); 
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

// not reflect case
PowerMockito.whenNew(URL.class).withArguments(Mockito.anyString()).thenReturn(mockedURL);

// reflect case
PowerMockito.whenNew(URL.class.getConstructor(new Class<?>[]{String.class})).withArguments(Mockito.anyString()).thenReturn(mockedURL);

1 Ответ

0 голосов
/ 19 апреля 2020
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

Это определяет, что при вызове метода openConnection() для объекта mockedURL вместо него возвращается значение mockedConnection (а не реальный код). Этот синтаксис / подход также определен / используется в библиотеке "Mockito".

PowerMockito.whenNew(URL.class).withArguments(Mockito.anyString())

Это будет использоваться при создании объекта URL со строкой в ​​качестве аргумента. , Использование PowerMockito.whenNew() с аргументом class позволяет использовать withAnyArguments() для насмешки над любым конструктором этого класса, а не только с указанным c.

PowerMockito.whenNew(URL.class.getConstructor(new Class<?>[]{String.class}))

This используется для выбора спецификатора c. В данном случае это аргумент String. Поэтому, когда вы пишете new URL("some string"), используется этот макет.

new Class<?>[]{String.class}

Это просто массив с объявлением значений, как и любой другой. Это похоже на запись

new int[] {4, 6, 10}

Только то, что тип - Class<?>, а значения - один String.class объект.

...