在 PowerMock Accepting 中指定 reflect 时的行为差异?

difference in behavior when reflect is specified in PowerMock Accepting?

我是 Java 初学者。

在下面的源码中可以看到,我在网上搜索URL class Mock的示例代码时, 有没有反射的情况和有反射的情况。 每种情况下的行为有何不同?

像{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);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

这定义了当在 mockedURL 对象上调用 openConnection() 方法时,返回值 mockedConnection(而不是调用真正的代码)。 syntax/approach 也是 "Mockito" 库中的 defined/used。

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

这将在您使用字符串作为参数创建 URL 对象时使用。将 PowerMockito.whenNew()class 参数一起使用允许您使用 withAnyArguments() 模拟该 class 的任何构造函数,而不仅仅是特定的构造函数。

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

这用于select特定的构造函数。在本例中,它是带有 String 参数的那个。所以当你写new URL("some string")的时候,就用到了这个mock

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

这只是一个数组,其值声明与其他数组一样。就像写作

new int[] {4, 6, 10}

只是类型是 Class<?> 并且值是一个 String.class 对象。