电流春季启动版本:3.4.2 testng版本:7.10.2春季测试:6.2.2(来自父春季depenty) 春季3.2.0之后,我们被警告说@MockBean和@spybean被弃用,b ...

问题描述 投票:0回答:1

期:mytest

AbstracttestngspringContextTests是Spring

的类 logogic:baseapitest负责某种情况下的上下文负责模拟创建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 { } <- SomeBaseAPITest <- BaseAPITest (with custom @DefaultTestConfig annotation) <- AbstractTestNGSpringContextTests

@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(); } }

@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()); } }

public class MyTest extends SomeBaseAPITest {

    @Test
    void myTest() {
        var response = given()
        .get("http://blablabla.com");
    
        assertTrue(response != null);
    }

}
错误:
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
错误在这里表示代码:

doAnswer(invocationOnMock -> TestService.translate(invocationOnMock.getArgument(1))) .when(morningstarCsvService) .translate(any(), any(), any(), any(), any());

为什么我们使用这样的课程层次结构?一次运行上下文并在模拟配置中重复使用上下文。为什么要使用2种方法?一种方法加载上下文(因为默认情况下上下文是在beforeclass中加载的,但是在beforeSuite中,它被强迫加载)。第二个是创建模拟的划分的(在真实的示例中,还有更多类和更多的方法,这是一个抽象)。
Again:它正在当地工作,而不是在Jenknins上。詹金斯可以看到一些错误,也许他是正确的。悬停在
上的鼠标时

@MockitoSpyBean(reset = MockReset.NONE) private SomeCsvServiceImpl someCsvService;

表示未分配SomecsvService(意味着该值未初始化)。当有@mockbean注释时,没有这样的警告。希望从Communite获得帮助!!!
简化的Jenkins管道:

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 { ...

tried trip的私人对受保护的私人试图将字段移至测试类,试图通过不同的组合更改配置,不能迁移到@mockbean进行测试,因为它被标记为删除(我当然可以抑制删除警告,但这不是解决方案)
认为不要在jenkins

上看到null而不是对象的错误而不是对象。

不能写评论,因为声誉
您使用

MorningStarcsvService

变量,您如何声明它?我认为需要像

java spring spring-boot testng
1个回答
0
投票

< 50

private MorningstarCsvService morningstarCsvService;

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.