JenkinsPipelineUnit模拟共享库

时间:2017-11-08 10:19:18

标签: jenkins jenkins-pipeline jenkins-pipeline-unit

我写过Jenkins共享库,帮助程序包含像

这样的代码
def foo() {
    ...
    return steps.build(job: jobName, wait: true, propagate: true, parameters: parameters)
}

class RunConfig implements Serializable {
    ...
    RunWrapper runWrapper
}

我想为他们写单元测试

需要RunWrapper嘲笑。并且这是一个问题,因为RunWrapper被声明为:

public RunWrapper(Run<?,?> build, boolean currentBuild) {
    this.externalizableId = build.getExternalizableId();
    ...

因此我必须创建hudson.model.Run的实例以避免NPE。

我没有办法得到一些“假”Run。但是它的调用构造函数也很难(sources),因为它需要在Job实例中。

我到达它的最后一点是从class MockJob extends Job实现class MockItemGroup<T extends Item> implements ItemGrouphudson.model.Job.saveNextBuildNumber和运行时NPE,其中Job尝试在作业根目录中创建“nextBuildNumber”文件(mocked class返回{{ 1}}作为root dir)。

也许我错过了一些东西,还有另一种方法来测试null

2 个答案:

答案 0 :(得分:0)

您可以使用任何可用的模拟框架(例如mockito)。然后创建一个RunWrapper

的模拟
import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
import static org.mockito.Mockito.*; 
//.. 
RunWrapper runWrapperMock = mock(RunWrapper.class);

答案 1 :(得分:0)

我设法用PowerMockito模仿RunWrapper。在“build.gradle”中:

testCompile "org.powermock:powermock-module-junit4:1.7.1"
testCompile "org.powermock:powermock-api-mockito2:1.7.1"

请注意powermock-api-mockito(即第一版)在groovy中不起作用。

在代码中:

@RunWith(PowerMockRunner.class)
@PrepareForTest([RunWrapper.class])
class BarsTest extends BasePipelineTest {
    @Test
    void fooTest() throws Exception {
        RunWrapper runWrapper = PowerMockito.mock(RunWrapper.class)