JenkinsPipelineUnit 模拟共享库的 RunWrapper



我编写了 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.但是调用它的构造函数也是很难的方式(源),因为它需要Job实例。

我达到的最后一点是从hudson.model.Job.saveNextBuildNumber实现class MockJob extends Jobclass MockItemGroup<T extends Item> implements ItemGroup和运行时NPE,其中作业尝试在作业根目录中创建"nextBuildNumber"文件(模拟类返回null作为根目录)。

也许我错过了一些东西,还有另一种方法可以测试RunWrapper

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

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

我设法用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(即第 1 版)在 groovy 中不起作用。

在代码中:

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

最新更新