1

我编写了 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实例。

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

也许我遗漏了一些东西,还有另一种测试方法RunWrapper

4

2 回答 2

0

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

import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
import static org.mockito.Mockito.*; 
//.. 
RunWrapper runWrapperMock = mock(RunWrapper.class);
于 2017-11-08T15:04:28.073 回答
0

我设法RunWrapper用 PowerMockito 模拟。在“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)
于 2017-11-10T11:49:18.150 回答