我的管道中有這段代碼,現在我想使用spock框架為其添加單元測驗,問題是如何模擬或監視Jenkins.instance以及所有鏈接方法。
String deployPipeline = "Deploy/${projectID}/deploy-to-prod"
def lastRelease = Jenkins.instance.getItemByFullName(deployPipeline).getLastSuccessfulBuild()
String lastDeployedVersion = lastRelease.getBadgeActions().findResult {
String text = it.getText()
if (text != null && text.matches(/^Version\=/) != null) {
return text.find(/\d \.\d \.\d /)
}
}
uj5u.com熱心網友回復:
您不必模擬,Jenkins.instance但Run對于您定義的模擬物件,List<BuildBadgeAction>如果getBadgeActions()呼叫它應該回傳哪個。
您不想測驗 Jenkins 的呼叫堆疊,但是您的代碼對串列項做了什么,是嗎?
因此,您必須執行以下操作(在 JUnit 5/Mockito 半偽代碼中,我不使用 Spock,但我認為您明白了):
class YourClassTest {
@InjectMocks
YourClass yourClass = new YourClass();
@Mock
Run run;
@Test
testYourMethod() {
List<BuildBadgeAction> list = new ArrayList<>();
list.add( new ... BuildBadgeAction implementation ... );
list.add( new ... BuildBadgeAction implementation ... );
...
when( run.getBadgeActions() ).thenReturn( list );
assertEquals( "...", yourClass.getLastDeployedVersion() );
}
}
為了@InjectMocks作業,您必須在(或建構式或 setter ) 中有一個宣告Run run;YourClassYourClass(Run run)setRun(Run run)。
而且,順便說一句,沒有介面的實作BuildBadgeAction有一個getText()方法。
uj5u.com熱心網友回復:
我結束了這樣的事情
BuildBadgeAction badge1Mock = GroovyMock(BuildBadgeAction) {
_.getText() >> "Version= 1.2.3"
_.getDisplayName() >> "Version= 1.2.3"
}
BuildBadgeAction badge2Mock = GroovyMock(BuildBadgeAction) {
_.getText() >> "badge-2"
_.getDisplayName() >> "badge-2"
}
def runMock = GroovyMock(Run) {
_.getBadgeActions() >> {
return [badge1Mock, badge2Mock]
}
}
Item itemMock = GroovyMock(Item) {
_.getFullName() >> "job-1"
_.getLastSuccessfulBuild() >> {
runMock
}
}
def jenkinsInstanceMock = GroovyMock(Jenkins) {
_.getItemByFullName(_) >> { String fullName ->
itemMock
}
GroovySpy(Jenkins, global: true, useObjenesis: true) {
_.getInstance() >> jenkinsInstanceMock
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/368173.html
