Я написал несколько тестов для статического метода. Статический метод принимает только один аргумент. Тип аргумента является окончательным классом. С точки зрения кода:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
Итак, для Utility
класса я создал тестовый класс, UtilityTests
в котором я написал тесты для этого метода getName
. Основой модульного тестирования является TestNG, а используемая библиотека - mocking Mockito
. Таким образом, типичный тест имеет следующую структуру:
public class UtilityTests {
@Test
public void getNameTest() {
// Arrange
Customer customerMock = Mockito.mock(Customer.class);
Mockito.when(...).thenReturn(...);
// Act
Optional<String> name = Utility.getName(customerMock);
// Assert
Assert.assertTrue(...);
}
}
В чем проблема ?
Принимая во внимание, что тесты успешно выполняются локально, внутри IntelliJ они терпят неудачу на Jenkins (когда я помещаю свой код в удаленную ветку, запускается сборка и в конце запускаются модульные тесты). Сообщение об ошибке выглядит следующим образом:
org.mockito.exceptions.base.MockitoException: не может издеваться / шпионский класс com.packagename.Customer Mockito не может издеваться / шпионить, потому что: - последний класс
Что я пробовал?
Я немного искал, чтобы найти решение, но не смог. Я отмечаю здесь, что мне не разрешено менять тот факт, что Customer
это последний класс. В дополнение к этому, я хотел бы, если возможно, вообще не изменять его дизайн (например, создавать интерфейс, который содержал бы методы, которые я хочу смоделировать, и утверждать, что класс Customer реализует этот интерфейс, как правильно указал Хосе в своей статье). комментарий). То, что я попробовал, это второй вариант, упомянутый на финале конкурса . Несмотря на то, что это решило проблему, оно затормозило некоторые другие юнит-тесты :(, которые нельзя исправить ни одним очевидным способом.
Вопросов
Итак, вот два вопроса, которые у меня есть:
- Как это возможно в первую очередь? Разве тест не должен пройти как локально, так и в Дженкинсе?
- Как это можно исправить, основываясь на вышеупомянутых ограничениях?
Заранее благодарю за любую помощь.
Customer
этом какая-то логика, или это просто тупой класс данных? Если это просто набор полей с геттерами и сеттерами, то вы можете просто создать его экземпляр.
enable final
конфигурация работает в вашей рабочей области, но при запускеJenkins
не может найти этот файл. Проверьте, гдеJenkins
находится файл и находится ли он на самом деле там или нет.