Попытка имитировать два класса с помощью Groovy Spock Mock: GroovyCastException - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь имитировать два класса в var-скрипте Jenkins Pipeline, но, тем не менее, я заказываю определение Mock, я получаю GroovyCastException, а макет для второго класса инициируется Вот как выглядит мой Spock-Test:

import com.homeaway.devtools.jenkins.testing.JenkinsPipelineSpecification
import com.pipeline.ClassA
import com.pipeline.DBReader
import groovy.sql.Sql
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
import hudson.model.Result

class execScriptSpec extends JenkinsPipelineSpecification {
    def execPipelineScript = null

    def mockStage = [timeout: [time: 'mocktime']]
    def mockScript = [...]

def setup() {
    execPipelineScript = loadPipelineScriptForTest("vars/execScript.groovy")
}

def "Test Pipeline-Script"() {

    setup:

      GroovyMock(ClassA, global: true)
      new ClassA(*_) >> Mock(ClassA) {
        loadScope(_) >> null
        loadJsonFromURL(_) >> null
      }

      GroovyMock(DBReader, global: true)
      new DBReader(*_) >> Mock(DBReader) {
        loadDBDriver(_) >> null
      }
  when:
      execPipelineScript(mockScript, mockStage)
  then:
      true

И это тестируемый код:

import com.pipeline.DBReader
import com.pipeline.ClassA

def call(script, stage) {
  def pipelineConfig = script.pipelineConfig
  def stageStatus = pipelineConfig.general.stageStatus

  def projectName = script.env.project

  // DB connection parameters
  def dbName = script.deliveryConfig.system.dbName
  def dbSchema = script.deliveryConfig.system.dbSchema
  def dbServer = script.deliveryConfig.system.dbServer
  def dbUser = script.deliveryConfig.system.dbUser
  // DB Driver to use
  def dbDriver = script.deliveryConfig.system.dbDriver
  def dbPassword = script.env.password

  // Create new DB-Client
  DBReader dbClient = new DBReader(dbName, dbSchema, dbServer, dbUser, dbPassword, dbDriver)
  dbClient.loadDBDriver()
   
  def contextParameter = script.params['Context']

  ClassA mapGavToVersionRange = new ClassA(projectName, contextParameter, script)
  classAInstance.loadDeliveryScope( dbClient )
  def url = 'https://some.valid.url'
  classAInstance.loadJsonFromURL(url)

  ...

Так что не поймите меня неправильно: фактическое издевательство над одним или другой класс работает (если я поставлю только один из них в свой тест), но как только я поставлю их оба, второй не будет работать. И в настоящее время я не знаю, почему это происходит. Было бы здорово, если у кого-нибудь есть идея :-) Большое спасибо!

...