2017-01-01 3 views
1

Я собираюсь протестировать метод, который принимает список java.net.NetworkInterface как аргумент, и поэтому я должен высмеять окончательный абстрактный класс или создать его экземпляр. Любая идея об этом?Как mock java.net.NetworkInterface?

Метод что-то вроде этого:

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

Написание Mockito-когда для каждого метода геттерного вроде некрасиво, поэтому я думаю, что я должен написать свою собственную версию этого 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, который я должен написать еще одну оболочку для этого! Итак, я собираюсь использовать команды оболочки для извлечения адреса mac, net mask и имени интерфейса и шлюза хоста, и я не хочу использовать NetworkInterface, потому что со всеми этими ограничениями они просто предлагают «вам не разрешено коснитесь этого "! P.S: Интересно, почему ребята из Oracle одержимы окончательным абстрактом, я знаю, что они знают больше, чем я, но в этом конкретном случае NetworkInterface, почему окончательный реферат? использование единого всеобъемлющего конструктора сделает класс неизменным.

+0

Возможно, вы можете предоставить часть своего кода и объяснить немного лучше, что вы хотите проверить, - может быть, вам будет легче помочь. –

+0

Я не уверен, что вы можете сделать окончательный выпуск, но я бы подумал об использовании шаблона проектирования адаптера. – Enzokie

+0

@hagrawal, вы правы, так как насмехаться над этим? – redbeard1970

ответ

0

Вы можете использовать PowerMockito для издевательства стандартной стандартной библиотеки .

Например,

@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