我将测试一个采用List java.net.NetworkInterface作为参数的方法,因此我应该模拟最终的抽象类或实例化它。有任何想法吗?
该方法是这样的:
public void handleInterfaces(List<NetworkInterface> interfaces){
for(NetworkInterface interface : interfaces){
//get interface mac address
//get interface name
//doSomething here;
}
}
Run Code Online (Sandbox Code Playgroud)
为每个getter方法编写一个mockito-when有点难看,所以我认为我应该使用构造函数编写我自己的POJO类版本。在此之前,我想知道是否有更好的方案可以执行以下操作:
NetworkInterface mockedInterface = instantiateTheInterface("eth1",192.168.1.1,theMacAddress);
Run Code Online (Sandbox Code Playgroud)
我坚持“永远不要使用powermockito”的规则,所以我只实现了一个包装器类,我认为这是最干净的方法:
public class NetworkInterfaceWrapper{
private NetworkInterface networkInterface;
public NetworkInterfaceWrapper(NetworkInterface networkInterface){
this.networkInterface = networkInterface;
}
public String getName(){
return networkInterface.getName();
}
...and so on for all Getters i've used from NetworkInterface
}
Run Code Online (Sandbox Code Playgroud)
最终解决方案 事实证明,NetworkInterface中还有另一个令人讨厌的对象,称为InterfaceAddress,我应该为此编写另一个包装器!因此,我将使用Shell命令来检索主机的MAC地址,网络掩码和接口名称以及网关,而我也不想使用NetworkInterface,因为在所有这些限制下,它们只是建议“您不得触摸这个”!PS:我想知道为什么Oracle专家们迷恋最终摘要,我知道他们比我更了解,但是在NetworkInterface的这种特殊情况下,为什么要最终摘要呢?使用单个综合构造函数会使该类不可变
您可以使用 PowerMockito 来模拟 java 标准库的最终类。
例如;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ NetworkInterface.class })
public class NetworkInterfaceMocks {
@Test
public void sameClassSuccess() throws Exception {
final NetworkInterface mockInterface = PowerMockito.mock(NetworkInterface.class);
when(mockInterface.isUp()).thenReturn(true);
assertTrue(mockInterface.isUp());
}
Run Code Online (Sandbox Code Playgroud)
@Test
@PrepareForTest(OtherClass.class)
public void differentClassSuccess() throws Exception {
final NetworkInterface mockInterface = PowerMockito.mock(NetworkInterface.class);
when(mockInterface.isUp()).thenReturn(true);
assertTrue(new OtherClass().isUp(mockInterface));
}
Run Code Online (Sandbox Code Playgroud)
在我看来,它应该只在非常罕见和不可避免的情况下使用。