我想使用模拟和单元测试来测试此方法
公共类CurrentIP {
public static String getIPAddress() {
try {
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface intf : interfaces) {
List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
for (InetAddress addr : addrs) {
if (!addr.isLoopbackAddress()) {
String sAddr = addr.getHostAddress();
boolean isIPv4 = sAddr.indexOf(':') < 0;
if (isIPv4)
return sAddr;
}
}
}
} catch (Exception ignored) {
} // for now eat exceptions
return "";
}
答案 0 :(得分:0)
创建一个类IpAddressProvider
和NetworkInterfaceProvider
。
让NetworkInterfaceProvider
有一个方法getNetworkInterfaces()
,它从List<NetworkInterfaces>
返回NetworkInterface
。
让NetworkInterfaceProvider
是IpAddressProvider
的依赖项,它通过构造函数传递并存储在私有字段ipAddressProvider
中。
让IpAddressProvider
有一个公共方法getIPAddress()
,其中它调用ipAddressProvider.getNetworkInterfaces()
,并以您发布的静态方法进行处理。
现在,您可以通过提供getIPAddress
的虚假实例来测试IpAddressProvider
的方法NetworkInterfaceProvider
,在其中您可以提供要控制的NetworkInterfaces的模拟列表。
mockedIpAddressProvider = Mockito.mock(NetworkInterfaceProvider.class);
ipAddressProviderWhichYouWantToTest = IpAddressProvider(mockedIpAddressProvider);
例如:
在测试中,您对伪造的NetworkInterfaceProvider
实例进行硬编码以返回一个空列表。
Mockito.when(mockedIpAddressProvider.getNetworkInterfaces()).thenReturn(emptyList)
然后,您期望getIPAddress()
方法返回空字符串
assertEquals("",ipAddressProviderWhichYouWantToTest.getIPAddress());