2017-01-01 193 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