期: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
变量,您如何声明它?我认为需要像
< 50
private MorningstarCsvService morningstarCsvService;