ExpediaGroup / jenkins-spock

Unit-test Jenkins pipeline code with Spock
https://javadoc.io/doc/com.homeaway.devtools.jenkins/jenkins-spock
Apache License 2.0
186 stars 73 forks source link

How to test some pipeline steps without mock ? #100

Open PavelKa opened 3 years ago

PavelKa commented 3 years ago

Desired Behavior

I have simple class method wich I want to test :

static def getAllProperties(script,configDir,appId ) {
   def envProperties = script.readProperties file:  "${configDir}/env.properties"
    def props =  script.readProperties   default: envProperties ,file: "${configDir}/${appId}/env.properties"
    props
  }

I'm using JenkinsPipelineSpecification to write tests in my project but in this case, readProperties are mocked and test will not detect that I have typo in parameter default. Also, the compiler will not fail. Is it possible to set up a test to fail or somehow configure to really call readProperties step ? Mocking using 1 * getPipelineMock("readProperties")(default:["x":"valueX"],file:"./appId/env.properties") >> ["y" : "valueY"] doesn't help as there is same typo as in the method implementation

Benefits

  1. Detecting such typos during a test is much more efficient than deploy to Jenkins and test manually
awittha commented 2 years ago

I am not quite sure I understand the question. It sounds like you're asking:

Assuming

  1. a function takes in a map of arguments
  2. One of the arguments' names is default

e.g. getAllProperties(default: ["x": "valueX")

Then

I would like a unit-test failure if my code calls this function with a typo, e.g.

getAllProperties(deflat: ["x": "valueX")

Is that correct?

PavelKa commented 2 years ago

Yes, that's what I need. There is method readProperties ( from the "Pipeline Utility Steps plugin") which expects "defaults" on input in my example, but I used "default". The test passes because I also used "default" in the getPipelineMock. I would like to find these types of errors/typos before deploying to Jenkins.