2017-01-01 186 views
1

我打算测试一个以java.net.NetworkInterface列表作为参数的方法,所以我应该嘲笑最终的抽象类或实例化它。 关于这些的任何想法?如何模拟java.net.NetworkInterface?

的方法是这样的:

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

编写的Mockito,当每一个getter方法是一种丑陋的,所以我觉得我应该写我自己的这个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的这种特殊情况下,为什么最终抽象?使用单一的综合构造函数将使类,不可变

+0

也许你可以提供一些你的代码,并更好地解释一下你想测试的东西 - 然后可能会更容易帮助你。 –

+0

我不确定您是否可以模拟最终的课程,但我会考虑使用适配器设计模式。 – Enzokie

+0

@hagrawal你是对的,那么如何嘲笑它呢? – redbeard1970

回答

0

你可以使用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)); 
} 

在我看来,应该只有在非常罕见的,非可以避免的情况下使用。

+0

对PowerMockito没有兴趣,反正更新了问题与我的最终解决方案 – redbeard1970