Текущая версия Spring Boot: 3.4.2 Testng Версия: 7.10.2 Spring Test: 6.2.2 (от Parent Spring Depedency) < /p>
После весенней загрузки 3.2.0 мы получали предупреждение, что @mockbean и @spybean устарели, но мы продолжали использовать их. С момента весеннего загрузки 3.4.0 они отмечены для удаления, поэтому мы соответственно перенесли их в @mockitobean и @mockityspybean. На местном, все работает, они работают, но на Дженкинсе мы видим ошибку, которую объект передал, когда () нулевой. Я пробовал много решений, не повезло, вот сценарий использования (упрощенное). Чтобы сохранить код рефакторирования NDA I, но сохранив основную цель использования: < /p>
Иерархия: mytest
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootTest(classes = { Application.class },
properties = { "spring.main.allow-bean-definition-overriding=true" },
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ComponentScan({ "com.blabla.blabla" })
@TestConfiguration
public @interface DefaultTestConfig {
}
< /code>
@DefaultTestConfig
public abstract class BaseAPITest extends AbstractTestNGSpringContextTests {
@LocalServerPort
private int port;
@BeforeSuite(alwaysRun = true)
public final void prepareTestContext() throws Exception {
log.info("Preparing test context");
super.springTestContextPrepareTestInstance();
}
}
< /code>
@SuppressWarnings("unchecked")
public class SomeBaseAPITest extends BaseAPITest {
@MockitoSpyBean(reset = MockReset.NONE)
private SomeCsvServiceImpl someCsvService;
@BeforeSuite(alwaysRun = true, dependsOnMethods = "prepareTestContext")
protected void prepareMocks() {
doAnswer(invocationOnMock -> TestService.translate(invocationOnMock.getArgument(1)))
.when(morningstarCsvService)
.translate(any(), any(), any(), any(), any());
}
}
< /code>
public class MyTest extends SomeBaseAPITest {
@Test
void myTest() {
var response = given()
.get("http://blablabla.com");
assertTrue(response != null);
}
}
< /code>
Ошибка: < /p>
18:11:09 [INFO]
18:11:09 [INFO] Results:
18:11:09 [INFO]
18:11:09 [ERROR] Failures:
18:11:09 [ERROR] SomeBaseAPITest.prepareMocks:83 » NullInsteadOfMock
18:11:09 Argument passed to when() is null!
18:11:09 Example of correct stubbing:
18:11:09 doThrow(new RuntimeException()).when(mock).someMethod();
18:11:09 Also, if you use @Mock annotation don't miss openMocks()
18:11:09 [INFO]
18:11:09 [ERROR] Tests run: 357, Failures: 1, Errors: 0, Skipped: 356
< /code>
Ошибка означает код здесь: < /p>
doAnswer(invocationOnMock -> TestService.translate(invocationOnMock.getArgument(1)))
.when(morningstarCsvService)
.translate(any(), any(), any(), any(), any());
< /code>
Почему мы используем такую иерархию классов? Запустить контекст один раз и повторно использовать контекст в конфигурации Mocks. Почему два метода для Beaforesuite? Один метод загружает контекст (потому что контекст по умолчанию загружается в beforclass, но в то время как он вручную загружается). Второй делегаты, создающие макеты (в реальном примере есть больше классов и больше методов, вот абстракция). < /P>
снова: он работает на локальном и не на Дженнинс. Дженкинс может увидеть некоторую ошибку, и, возможно, это правильно. При падении мыши на < /p>
@MockitoSpyBean(reset = MockReset.NONE)
private SomeCsvServiceImpl someCsvService;
< /code>
Показывает, что SomeeCSvService не назначается (означает, что значение не инициализировано). Когда была аннотация @mockbean, не было такого предупреждения. Я надеюсь получить помощь от сообщества!import hudson.util.Secret
node('maven38'){
try {
stage('Checkout code') {
git(branch: '$BRANCH', credentialsId: 'GITHUB', url: 'https://NDA')
}
stage('Run Test') {
withCredentials([usernamePassword(credentialsId: 'DEVOPS', passwordVariable: 'NEXUS_PASS', usernameVariable: 'NEXUS_USER')]) {
sh ''' mvn --settings ${WORKSPACE}/settings.xml -Dspring.profiles.active=test -Dsurefire.suiteXmlFiles=src/test/resources/suites/api-testng.xml clean test '''
}
}
} catch (e) {
echo 'This will run only if failed' throw e
} finally { ...
< /code>
Я попытался изменить частное на защиту, пытался перенести поле в тестовые классы, попытался изменить конфигурацию с различными комбинациями. Я не могу перейти на @mockbean, чтобы проверить, так как он помечен для удаления (конечно, я могу подавить предупреждения о удалении, но это не решение)
Я не ожидаю увидеть ошибки с нулевым вместо объекта в фиксированной конфигурации на дженкинах.
Подробнее здесь: https://stackoverflow.com/questions/795 ... g-boot-3-4