spring-cloud-contract icon indicating copy to clipboard operation
spring-cloud-contract copied to clipboard

spring-cloud-contract:generateTests behaviour differs when generating class from local contracts vs remote (scm) ones

Open mikouaj opened this issue 5 years ago • 0 comments

Describe the bug spring-cloud-contract:generateTests behaviour differs when generating class from local contracts vs remote (scm) ones.

When generated from local contracts (i.e. src/test/java/resources/contracts/item):

  • package of generated class is same as value of packageWithBaseClasses
  • name of base class used to extend test is same as my base class found in packageWithBaseClasses

When generated from remote (SCM) contracts:

  • package of generated class is <packageWithBaseClasses>.contracts
  • name of base class used to extend is Contracts<myBaseClassName>

In general, when generated from SCM contracts, both names of package and extended class are enhanced with Contracts string. This is causing undeterministing behaviour - different result when testing locally and after switching to remote.

Sample Cloud Dependencies Version : Hoxton.RELEASE

  1. Local mode
> ls src/test/resources/contracts/item/
itemcontract.groovy
> ls src/test/java/com/mycompany/contract/producer/contracts/ItemBase.java
src/test/java/com/mycompany/contract/producer/contracts/ItemBase.java
>

Plugin configuration:

<plugin>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-contract-maven-plugin</artifactId>
  <extensions>true</extensions>
  <configuration>
    <testFramework>JUNIT5</testFramework>
    <packageWithBaseClasses>com.mycompany.contract.producer.contracts</packageWithBaseClasses>
  </configuration>
</plugin>

mvn -DskipTests clean install - OK mvn clean package - OK, test was generated and passed successfully

  1. Reconfigure to remote Plugin configuration:
<plugin>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-contract-maven-plugin</artifactId>
  <extensions>true</extensions>
  <configuration>
    <testFramework>JUNIT5</testFramework>
    <packageWithBaseClasses>com.mycompany.contract.producer.contracts</packageWithBaseClasses>
    <contractsRepositoryUrl>git://ssh://git@localhost:2222/git-server/repos/contractsrepo.git</contractsRepositoryUrl>
	<contractDependency>
	  <groupId>${project.groupId}</groupId>
      <artifactId>${project.artifactId}</artifactId>
      <version>${project.version}</version>
    </contractDependency>
    <contractsMode>REMOTE</contractsMode> -->
  </configuration>
</plugin>

2.1 mvn spring-cloud-contract:pushStubsToScm - OK, stubs and contracts are pushed to SCM 2.2 mvn mvn clean package - NOT OK (can't find base class)

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/nick/devel/producer-app/target/generated-test-sources/contracts/com/mycompany/contract/producer/contracts/contracts/ItemTest.java:[3,54] cannot find symbol
  symbol:   class ContractsItemBase
  location: package com.mycompany.contract.producer.contracts

Additionally, package of generated looks like:

> grep package target/generated-test-sources/contracts/com/mycompany/contract/producer/contracts/contracts/ItemTest.java
package com.mycompany.contract.producer.contracts.contracts;
>

(note .contracts.contracts)

mikouaj avatar Dec 09 '19 13:12 mikouaj