Я написав кілька одиничних тестів для статичного методу. Статичний метод бере лише один аргумент. Тип аргументу - це заключний клас. З точки зору коду:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
Таким чином , для Utility
класу я створив тестовий клас , UtilityTests
в якому я написав тести для цього методу getName
. Основою тестування блоку є TestNG, а використовувана глузуюча бібліотека 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 вони не спрацьовують на Дженкінсі (коли я натискаю свій код у віддаленій гілці, запускається збірка і тестові одиниці запускаються в кінці). Повідомлення про помилку є таким, як:
org.mockito.exceptions.base.MockitoException: Не вдається знущатися / шпигунського класу com.packagename.Customer Mockito не може глузувати / шпигувати, тому що: - остаточний клас
Що я спробував?
Я трохи шукав, щоб знайти рішення, але не встиг. Тут я зауважу, що мені не дозволяється змінювати факт, який Customer
є заключним класом. На додаток до цього, я хотів би, якщо можливо, взагалі не змінювати його дизайн (наприклад, створити інтерфейс, який би містив методи, з яких я хочу знущатися, і констатувати, що клас клієнта реалізує цей інтерфейс, як правильно вказав Хосе в своїй коментар). Що я спробував, це другий варіант, згаданий на мокіто-фіналі . Незважаючи на те, що це вирішило проблему, воно гальмує деякі інші тести блоку :(, які неможливо виправити жодним чином.
Запитання
Ось ось два питання у мене:
- Як це можливо в першу чергу? Чи не повинен тест провалитися як на місцевому рівні, так і в Дженкінсі?
- Як це можна виправити виходячи з обмежень, про які я згадував вище?
Заздалегідь дякую за будь-яку допомогу.
Customer
є в ньому якась логіка чи це просто німий клас даних? Якщо це просто купа полів з геттерами та сетерами, то ви можете просто інстанціювати це.
enable final
конфігурація працює у вашій робочій області, але при запуску наJenkins
її файлі не вдається знайти цей файл. Перевірте, деJenkins
шукається файл і чи є він насправді чи ні.