Рубрики
Без рубрики

Как издеваться без использования Mockito или каких-либо фреймворков

Если вы писали юниты в своей жизни, вы должны быть знакомы с фреймворком Mockito или любым другим… Помечено как тестирование, java, mockito, junit.

Если вы писали юниты в своей жизни, вы должны быть знакомы с фреймворком Mockito или любым другим фреймворком, и вы, должно быть, использовали его для моделирования класса и определения вывода определенных вызовов методов во время выполнения. Главное преимущество использования такого фреймворка, как Mockito, заключается в том, что он значительно упрощает разработку тестов для классов с внешними зависимостями.

Теперь, что, если я не буду использовать никакой фреймворк? Смогу ли я по-прежнему издеваться над поведением зависимых классов? Я попытаюсь написать модульный тест для приведенного ниже фрагмента кода без Mockito и выясню.

Вот код, который я хочу протестировать:

public class IncrementNumber {

    public int getIncrementedNumber(int num){
        DBConn conn = getConn();        
        return conn.getValue(num);
    }

    DBConn getConn(){
        return DBConnFactory.establishConnection();
    }
}

Я хочу протестировать метод получить увеличенное число в этом классе но мы можем видеть, как возврат выходных данных зависит от подключения к базе данных. Мы не можем установить соединение в тестовом классе и заставить его вызывать реальную базу данных только для проверки поведения метода, верно? Итак, как же нам высмеять такое поведение?

Мы будем использовать одно из самых красивых свойств Java – полиморфизм. Полиморфизм позволяет нам использовать переопределение методов. Версия выполняемого метода будет определяться объектом, который используется для его вызова. Если для вызова метода используется объект родительского класса, то будет выполнена версия в родительском классе, но если для вызова метода используется объект подкласса, то будет выполнена версия в дочернем классе. Теперь ты понимаешь намек? Это именно то, от чего мы выиграем, чтобы решить вышеприведенную постановку проблемы.

Мы создадим номер приращения дочернего класса и переопределим getConn , чтобы вернуть мой собственный макет для DBConn. Это выглядит так:

public class MockIncrementNumber extends IncrementNumber{

    MockDBConn conn;

    @Override
    DBConn getConn(){
        this.conn = new MockDBConn();
        return this.conn;
    }
}

Макет класса DBConn, собирающийся захватить аргумент, переданный в Получить значение и верните вывод, так что его также необходимо переопределить. Вот как это выглядит:

public class MockDBConn extends DBConn{

    @Override
    public int getValue(int param){
        return param + 4;
    }
}

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

@Test
public void shouldReturnIncrementedValue{
    IncrementNumber inc = new MockIncrementNumber();
    assert inc.getIncrementedNumber(4) == 8;
}

Для решения этой проблемы мы использовали базовые объектно-ориентированные принципы. Мы смогли создать дочерние макетные классы и легко переопределить поведение исходных классов. Но нам пришлось написать больше кода, когда мы пошли по этому пути для издевательского поведения. Это может быть как выгодно, так и невыгодно. Вероятно, это хорошо, так как макетные классы видны, и мне не нужно визуализировать, что они делают, или просматривать их документацию. Я не хочу сказать, что мы никогда не должны использовать насмешливый фреймворк, я просто говорю, что иногда разумно не использовать его. Кроме того, эти фреймворки являются еще одной зависимостью от вашего проекта, и это добавляет собственные проблемы с ремонтопригодностью и ограничивает изменения. При этом, если проще использовать насмешливый фреймворк, сделайте это. Если нет, используйте вместо этого этот подход.

Оригинал: “https://dev.to/drathi/how-to-mock-without-using-mockito-or-any-frameworks-1b5g”