Привет, меня зовут Максим, и сегодня я расскажу о принципе инъекции зависимостей и использовании Mockito для создания моков в тестах классов Feline, Cat и Lion. Также я покажу, как можно применить параметризацию и оценить покрытие кода с помощью Jacoco.
Принцип инъекции зависимостей является важным принципом разработки, который говорит о том, что класс не должен зависеть от конкретной реализации другого класса, а должен использовать абстракцию или интерфейс. Это позволяет легко менять реализацию зависимости и улучшает расширяемость и тестируемость кода.
Давайте рассмотрим пример классов Feline, Cat и Lion. Класс Feline является абстрактным и имеет метод voice, который возвращает звук, издаваемый кошкой. Класс Cat наследуется от класса Feline и реализует метод voice, возвращающий звук ″Мяу″. Класс Lion также наследуется от класса Feline, но его реализация метода voice должна возвращать звук ″Рррр″.Для того, чтобы класс Lion не зависел от класса Feline, мы можем использовать принцип инъекции зависимостей. Создадим интерфейс FelineInterface, который будет содержать метод voice. Затем классы Feline, Cat и Lion будут реализовывать этот интерфейс.java
public interface FelineInterface {
String voice;
}
public abstract class Feline implements FelineInterface {
// реализация метода voice
}
public class Cat implements FelineInterface {
// реализация метода voice
}
public class Lion implements FelineInterface {
// реализация метода voice
}
Теперь давайте перейдем к написанию тестов с использованием Mockito. Mockito ⎼ это фреймворк для создания моков в тестах. Моки ⎼ это объекты, которые имитируют поведение зависимостей и позволяют нам изолировать тестируемый класс от реальных зависимостей.В тестах классов Feline, Cat и Lion мы можем использовать Mockito для создания моков зависимостей и проверки правильности их использования. Например, мы можем создать мок FelineInterface и задать ему ожидаемое поведение⁚
java
FelineInterface felineMock Mockito.mock(FelineInterface.class);
Mockito.when(felineMock.voice).thenReturn(″Рррр″);
Далее мы можем создать экземпляры классов Cat и Lion и проверить, что их методы voice работают корректно с использованием зависимости felineMock.Теперь давайте рассмотрим параметризацию тестов. Параметризованные тесты позволяют нам проверить различные комбинации входных данных и ожидаемых результатов в рамках одного теста.Например, мы можем написать параметризованный тест для класса Cat, который будет проверять, что метод voice возвращает правильный звук для разных кошек. Для этого мы можем создать аннотированный метод с аргументами, задающими входные данные и ожидаемый результат⁚
java
@ParameterizedTest
@CsvSource({″Мурлык″, ″Царапка″, ″Бегемот″})
void testVoice(String expected) {
Cat cat new Cat;
assertEquals(expected, cat.voice);
}
В данном примере тест будет запущен три раза с разными значениями аргумента expected, и мы проверим, что метод voice возвращает правильный результат.Наконец, давайте обсудим оценку покрытия кода с помощью Jacoco. Jacoco ౼ это инструмент для измерения покрытия кода тестами. Хорошим практикой является достижение 100% покрытия кода для классов Feline٫ Cat и Lion.Для оценки покрытия кода с помощью Jacoco нам необходимо добавить зависимость в файл build.gradle⁚
groovy
apply plugin⁚ ‘jacoco’
jacoco {
toolVersion ‘0.8.4’
}
test {
jacoco {
append false
destinationFile file(″$buildDir/jacoco/jacocoTest.exec»)
}
}
В отчете о покрытии кода мы увидим процентное соотношение покрытого кода для каждого класса. Для наших классов Feline, Cat и Lion мы должны стремиться достичь 100% покрытия.