加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何模拟java.net.NetworkInterface?

发布时间:2020-12-15 02:17:58 所属栏目:Java 来源:网络整理
导读:我将测试一个以 java.net.NetworkInterface列表作为参数的方法,因此我应该模拟最终的抽象类或实例化它. 关于做这些的任何想法? 方法是这样的: public void handleInterfaces(ListNetworkInterface interfaces){ for(NetworkInterface interface : interfac
我将测试一个以 java.net.NetworkInterface列表作为参数的方法,因此我应该模拟最终的抽象类或实例化它.
关于做这些的任何想法?

方法是这样的:

public void handleInterfaces(List<NetworkInterface> interfaces){
    for(NetworkInterface interface : interfaces){
        //get interface mac address
        //get interface name
        //doSomething here;
    }
}

为每个getter方法编写一个mockito-when有点难看,所以我想我应该用构造函数编写我自己的这个POJO类的版本.在这之前,我想知道是否有更好的方案来做这样的事情:

NetworkInterface mockedInterface = instantiateTheInterface("eth1",192.168.1.1,theMacAddress);

我坚持“永远不要使用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
}

最终解决方案
事实证明,在NetworkInterface中还有另一个恼人的对象,叫做InterfaceAddress,我应该为它编写另一个包装器!
所以我将使用shell命令来检索主机的mac地址,网络掩码和接口名称以及网关,我不想使用NetworkInterface因为所有这些限制他们只是建议“你不允许触摸这个”!
P.S:我想知道为什么甲骨文家伙最终会痴迷于最后的抽象,我知道他们比我知道的更多,但在这个特殊的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());
}
@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));
}

在我看来,它应该只用于非常罕见和不可避免的情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读