Мокито не издевается над звонком - PullRequest
3 голосов
/ 27 января 2011

Одна из функций, которые я тестирую, - это вставка в машину.Я хочу смоделировать метод ping, который на самом деле пытается подключиться к компьютеру по ssh, поскольку я не подключаюсь к компьютеру.

Класс, который я тестирую:

public class TestMachine {
    public int ping(host){
    }

    public boolean machineIsGood(host) {
        blah blah
        int val = ping(host);
        blah blah blah
        if(val != 0) return false;
        return true;
    }
}

Тестовый классвыглядит примерно так:

public class TestClass {
    public void setUp() {
        TestMachine tester = spy(new TestMachine());
    }

    public void testOne() {
         when(test.ping(anyString()).thenReturn(-1);
         assertFalse(tester.machineIsGood("testHost"));
    }
{

Проблема в том, что когда я запускаю их локально, они работают просто отлично, но в нашей системе автоматической сборки кажется, что на самом деле она вызывает реальный пинг и получает исключение аутентификации,Я собираюсь использовать mock () вместо spy (), так как я прочитал, что это немного странно, но я просто не могу понять, что имеет значение в том, что он действительно вызывает метод!Просто интересно, есть ли у кого-нибудь еще понимание.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

По моему опыту, вы не должны использовать mocks для проверки взаимодействия между методами в одном классе.

Это говорит нам о том, что вы должны отделить SUT (тестируемую систему) от внешней зависимости, которую вам нужно заменить на двойной тест (пинг, который вы не хотите называть «по-настоящему» в своих модульных тестах). ).


public class Pinger {
    public int ping(String host) {
        // yadda yadda
    }
}

public class TestMachine {

    private final Pinger pinger;

    public TestMachine(final Pinger pinger) {
        this.pinger = pinger;
    }

    public boolean machineIsGood(host) {
        // blah blah
        int val = pinger.ping(host);
        // blah blah blah
        return val == 0;
    }
}

public class TestMachineTest {
    @Test
    public void testOne() {
        final Pinger pinger = mock(Pinger.class);
        when(pinger.ping(anyString())).thenReturn(-1);

        TestMachine tester = new TestMachine(pinger);
        assertFalse(tester.machineIsGood("testHost"));
    }
}

НТН

2 голосов
/ 06 июля 2013

Когда вы используете Mockito.spy (), используйте Mockito.doReturn () для не пустых методов или Mockito.doNothing () для пустых методов.

В вашем случае:

public class TestClass {
    public void setUp() {
        TestMachine tester = Mockito.spy(new TestMachine());
    }

    public void testOne() {
        doReturn(-1).when(test).ping(Mockito.anyString())
        assertFalse(tester.machineIsGood("testHost"));
    }
}
2 голосов
/ 27 января 2011
public class TestClass {
  private TestMachine tester;
  public void setUp() {         
    tester = mock(TestMachine.class);     
  }      

  public void testOne() {
          when(tester.ping(anyString()).thenReturn(-1);
          assertFalse(tester.machineIsGood("testHost"));
     }
} 
...