Add junit5 support (#690)

* Refactoring: extract class building methods.
* Move imports to import providers.
* Switch to new TestFramework implementation with TestFrameworkDefinition
delegate. Handle ignoring tests correctly in JUnit5.
* Implement handling JUnit5 rules.
* Add tests for JUNIT5.
* Update docs.

fixes gh-489
This commit is contained in:
Olga Maciaszek-Sharma
2018-07-19 15:03:42 +02:00
committed by Marcin Grzejszczak
parent 718cca099b
commit b48d50edcc
21 changed files with 940 additions and 280 deletions

View File

@@ -15,7 +15,7 @@ produced by Spring Cloud Contract Verifier.
* Messaging routes, if you're using a messaging service. We integrate with Spring
Integration, Spring Cloud Stream, Spring AMQP, and Apache Camel. You can also set your
own integrations.
* Acceptance tests (in JUnit or Spock) are used to verify if server-side implementation
* Acceptance tests (in JUnit 4, JUnit 5 or Spock) are used to verify if server-side implementation
of the API is compliant with the contract (__server tests__). A full test is generated by
Spring Cloud Contract Verifier.
@@ -363,8 +363,8 @@ mode for HTTP contracts. However, JAX-RX client and explicit HTTP invocations ca
used. (To do so, change the `testMode` property of the plugin to `JAX-RS` or `EXPLICIT`,
respectively.)
Apart from the default JUnit, you can instead use Spock tests, by setting the plugin
`testFramework` property to `Spock`.
Apart from the default JUnit 4, you can instead use JUnit 5 or Spock tests, by setting the plugin
`testFramework` property to either `JUNIT5` or `Spock`.
TIP: You can now also generate WireMock scenarios based on the contracts, by including an
order number followed by an underscore at the beginning of the contract file names.

View File

@@ -69,8 +69,8 @@ messaging configuration, so you only need the one annotation.
=== Publisher-Side Test Generation
Having the `input` or `outputMessage` sections in your DSL results in creation of tests
on the publisher's side. By default, JUnit tests are created. However, there is also a
possibility to create Spock tests.
on the publisher's side. By default, JUnit 4 tests are created. However, there is also a
possibility to create JUnit 5 or Spock tests.
There are 3 main scenarios that we should take into consideration:

View File

@@ -245,8 +245,8 @@ from the Groovy DSL should be placed. By default its value is
`$buildDir/generated-test-sources/contractVerifier`.
* *stubsOutputDir*: Specifies the directory where the generated WireMock stubs from
the Groovy DSL should be placed.
* *targetFramework*: Specifies the target test framework to be used. Currently, Spock and
JUnit are supported with JUnit being the default framework.
* *targetFramework*: Specifies the target test framework to be used. Currently, Spock, JUnit 4 (`TestFramework.JUNIT` and
JUnit 5 are supported with JUnit 4 being the default framework.
* *contractsProperties*: a map containing properties to be passed to Spring Cloud Contract
components. Those properties might be used by e.g. inbuilt or custom Stub Downloaders.
@@ -582,8 +582,8 @@ classes.
use Spock classes, the class is `spock.lang.Specification`.
* *contractsDirectory*: Specifies a directory containing contracts written with the
GroovyDSL. The default directory is `/src/test/resources/contracts`.
* *testFramework*: Specifies the target test framework to be used. Currently, Spock and
JUnit are supported with JUnit being the default framework
* *testFramework*: Specifies the target test framework to be used. Currently, Spock, JUnit 4 (`TestFramework.JUNIT` and
6JUnit 5 are supported with JUnit 4 being the default framework.
* *packageWithBaseClasses*: Defines a package where all the base classes reside. This
setting takes precedence over *baseClassForTests*. The convention is such that, if you
have a contract under (for example) `src/test/resources/contract/foo/bar/baz/` and set

View File

@@ -21,6 +21,7 @@ import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.maven.model.Dependency;
@@ -33,6 +34,7 @@ import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.RepositorySystemSession;
import org.springframework.cloud.contract.maven.verifier.stubrunner.AetherStubDownloaderFactory;
import org.springframework.cloud.contract.spec.ContractVerifierException;
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;

View File

@@ -128,6 +128,10 @@
<artifactId>spring-mock-mvc</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>

View File

@@ -18,9 +18,10 @@ package org.springframework.cloud.contract.verifier.builder
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.util.NamesUtil
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
/**
* Builds a class. Adds all the imports, static imports etc.
@@ -104,11 +105,16 @@ class ClassBuilder {
return this
}
ClassBuilder addImport(List<String> importsToAdd) {
ClassBuilder addImports(List<String> importsToAdd) {
imports.addAll(importsToAdd)
return this
}
ClassBuilder addStaticImports(List<String> importsToAdd) {
staticImports.addAll(importsToAdd)
return this
}
ClassBuilder addStaticImport(String importToAdd) {
staticImports << importToAdd
return this
@@ -124,13 +130,6 @@ class ClassBuilder {
return this
}
private String appendColonIfJUniTest(String field) {
if (lang == TestFramework.JUNIT && !field.endsWith(';')) {
return "$field;"
}
return field
}
ClassBuilder addField(List<String> fieldsToAdd) {
fields.addAll(fieldsToAdd.collect { appendColonIfJUniTest(it) })
return this
@@ -202,4 +201,15 @@ class ClassBuilder {
void addClassLevelAnnotation(String annotation) {
classLevelAnnotations << annotation
}
private String appendColonIfJUniTest(String field) {
if (isJUnitType(field)) {
return "$field;"
}
return field
}
private boolean isJUnitType(String field) {
TestFramework.JUNIT == lang || TestFramework.JUNIT5 == lang && !field.endsWith(';')
}
}

View File

@@ -16,9 +16,12 @@
package org.springframework.cloud.contract.verifier.builder
import java.util.regex.Pattern
import groovy.json.StringEscapeUtils
import groovy.transform.PackageScope
import groovy.transform.TypeChecked
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.spec.internal.Cookie
import org.springframework.cloud.contract.spec.internal.ExecutionProperty
@@ -29,8 +32,6 @@ import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.util.MapConverter
import java.util.regex.Pattern
import static groovy.json.StringEscapeUtils.escapeJava
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT
@@ -195,7 +196,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
protected String getInputString() {
String request = 'ContractVerifierMessage inputMessage = contractVerifierMessaging.create('
if (inputMessage.messageBody) {
request = "${request}\n\t\t\t\t\"${StringEscapeUtils.escapeJava(bodyAsString)}\"\n"
request = "${request}\n\t\t\t\t\"${escapeJava(bodyAsString)}\"\n"
}
if (inputMessage.messageHeaders) {
request = "${request}\t\t\t\t, headers()"

View File

@@ -16,20 +16,25 @@
package org.springframework.cloud.contract.verifier.builder
import java.lang.invoke.MethodHandles
import groovy.transform.Canonical
import groovy.transform.EqualsAndHashCode
import groovy.transform.PackageScope
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.builder.imports.HttpImportProvider
import org.springframework.cloud.contract.verifier.builder.imports.MessagingImportProvider
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.config.TestMode
import org.springframework.cloud.contract.verifier.file.ContractMetadata
import java.lang.invoke.MethodHandles
import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getImports
import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getRuleImport
import static org.springframework.cloud.contract.verifier.builder.imports.BaseImportProvider.getStaticImports
import static org.springframework.cloud.contract.verifier.util.NamesUtil.capitalize
/**
* Builds a single test for the given {@link ContractVerifierConfigProperties properties}
*
@@ -48,61 +53,39 @@ class JavaTestGenerator implements SingleTestGenerator {
@Override
String buildClass(ContractVerifierConfigProperties configProperties, Collection<ContractMetadata> listOfFiles, String className, String classPackage, String includedDirectoryRelativePath) {
ClassBuilder clazz = ClassBuilder.createClass(capitalize(className), classPackage, configProperties, includedDirectoryRelativePath)
if (configProperties.imports) {
configProperties.imports.each {
clazz.addImport(it)
}
}
if (configProperties.staticImports) {
configProperties.staticImports.each {
clazz.addStaticImport(it)
}
}
if (isScenarioClass(listOfFiles)) {
clazz.addImport(configProperties.targetFramework.getOrderAnnotationImport())
clazz.addImports(configProperties.targetFramework.getOrderAnnotationImports())
clazz.addClassLevelAnnotation(configProperties.targetFramework.getOrderAnnotation())
}
addJsonPathRelatedImports(clazz)
processContractFiles(listOfFiles, configProperties, clazz)
return clazz.build()
}
private void processContractFiles(Collection<ContractMetadata> listOfFiles,
ContractVerifierConfigProperties configProperties, ClassBuilder clazz) {
Map<ParsedDsl, TestType> contracts = mapContractsToTheirTestTypes(listOfFiles)
boolean restAssured2Present = this.checker.isClassPresent(REST_ASSURED_2_0_CLASS)
String restAssuredPackage = restAssured2Present ? 'com.jayway.restassured' : 'io.restassured'
if (log.isDebugEnabled()) {
log.debug("Rest Assured version 2.x found [${restAssured2Present}]")
}
boolean conditionalImportsAdded = false
boolean toIgnore = listOfFiles.ignored.find { it }
contracts.each { ParsedDsl key, TestType value ->
boolean toIgnore = listOfFiles.ignored.find {it}
contracts.each {ParsedDsl key, TestType value ->
if (!conditionalImportsAdded) {
clazz.addImports(getImports(configProperties.targetFramework))
clazz.addStaticImports(getStaticImports(configProperties.targetFramework))
if (contracts.values().contains(TestType.HTTP)) {
if (configProperties.testMode == TestMode.JAXRSCLIENT) {
clazz.addStaticImport('javax.ws.rs.client.Entity.*')
if (configProperties.targetFramework == TestFramework.JUNIT) {
clazz.addImport('javax.ws.rs.core.Response')
}
} else if (configProperties.testMode == TestMode.MOCKMVC) {
clazz.addStaticImport("${restAssuredPackage}.module.mockmvc.RestAssuredMockMvc.*")
} else {
clazz.addStaticImport("${restAssuredPackage}.RestAssured.*")
}
addHttpRelatedEntries(clazz, configProperties)
}
if (configProperties.targetFramework == TestFramework.JUNIT) {
if (contracts.values().contains(TestType.HTTP) && configProperties.testMode == TestMode.MOCKMVC) {
clazz.addImport("${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification")
clazz.addImport("${restAssuredPackage}.response.ResponseOptions")
} else if (contracts.values().contains(TestType.HTTP) && configProperties.testMode == TestMode.EXPLICIT) {
clazz.addImport("${restAssuredPackage}.specification.RequestSpecification")
clazz.addImport("${restAssuredPackage}.response.Response")
}
clazz.addImport('org.junit.Test')
}
clazz.addStaticImport('org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat')
if (configProperties.ruleClassForTests) {
clazz.addImport('org.junit.Rule').addRule(configProperties.ruleClassForTests)
addRule(configProperties, clazz)
}
if (contracts.values().contains(TestType.MESSAGING)) {
addMessagingRelatedEntries(clazz)
@@ -116,8 +99,31 @@ class JavaTestGenerator implements SingleTestGenerator {
if (toIgnore) {
clazz.addImport(configProperties.targetFramework.getIgnoreClass())
}
}
return clazz.build()
private void addRule(ContractVerifierConfigProperties configProperties, ClassBuilder clazz) {
clazz.addImport(getRuleImport())
if (configProperties.targetFramework.annotationLevelRules()) {
clazz.addClassLevelAnnotation(configProperties.targetFramework
.getRuleAnnotation(configProperties.ruleClassForTests))
} else {
clazz.addRule(configProperties.ruleClassForTests)
}
}
private void addHttpRelatedEntries(ClassBuilder clazz, ContractVerifierConfigProperties configProperties) {
HttpImportProvider httpImportProvider = new HttpImportProvider(getRestAssuredPackage())
clazz.addImports(httpImportProvider.getImports(configProperties.targetFramework, configProperties.testMode))
clazz.addStaticImports(httpImportProvider.getStaticImports(configProperties.targetFramework, configProperties.testMode))
}
private String getRestAssuredPackage() {
boolean restAssured2Present = this.checker.isClassPresent(REST_ASSURED_2_0_CLASS)
String restAssuredPackage = restAssured2Present ? 'com.jayway.restassured' : 'io.restassured'
if (log.isDebugEnabled()) {
log.debug("Rest Assured version 2.x found [${restAssured2Present}]")
}
return restAssuredPackage
}
@Override
@@ -159,8 +165,8 @@ class JavaTestGenerator implements SingleTestGenerator {
}
private void addJsonPathRelatedImports(ClassBuilder clazz) {
clazz.addImport(['com.jayway.jsonpath.DocumentContext',
'com.jayway.jsonpath.JsonPath',
clazz.addImports(['com.jayway.jsonpath.DocumentContext',
'com.jayway.jsonpath.JsonPath',
])
if (this.checker.isClassPresent(JSON_ASSERT_CLASS)) {
clazz.addStaticImport(JSON_ASSERT_STATIC_IMPORT)
@@ -169,16 +175,11 @@ class JavaTestGenerator implements SingleTestGenerator {
private void addMessagingRelatedEntries(ClassBuilder clazz) {
clazz.addField(['@Inject ContractVerifierMessaging contractVerifierMessaging',
'@Inject ContractVerifierObjectMapper contractVerifierObjectMapper'
'@Inject ContractVerifierObjectMapper contractVerifierObjectMapper'
])
clazz.addImport([ 'javax.inject.Inject',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging',
])
clazz.addStaticImport('org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers')
clazz.addImports(MessagingImportProvider.getImports())
clazz.addStaticImports(MessagingImportProvider.getStaticImports())
}
}
class ClassPresenceChecker {
@@ -189,7 +190,7 @@ class ClassPresenceChecker {
try {
Class.forName(className)
return true
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException ignored) {
if (log.isDebugEnabled()) {
log.debug("[${className}] is not present on classpath. Will not add a static import.")
}

View File

@@ -19,13 +19,17 @@ package org.springframework.cloud.contract.verifier.builder
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import groovy.util.logging.Slf4j
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.config.TestMode
import org.springframework.cloud.contract.verifier.file.ContractMetadata
import org.springframework.cloud.contract.verifier.util.NamesUtil
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5
import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK
/**
* Builds a test method. Adds an ignore annotation on a method if necessary.
*
@@ -57,7 +61,7 @@ class MethodBuilder {
if (log.isDebugEnabled()) {
log.debug("Stub content Groovy DSL [$stubContent]")
}
String methodName = methodName(contract, stubsFile, stubContent)
String methodName = MethodBuilder.methodName(contract, stubsFile, stubContent)
return new MethodBuilder(methodName, stubContent, configProperties, contract.ignored || stubContent.ignored)
}
@@ -91,11 +95,11 @@ class MethodBuilder {
* Appends to the {@link BlockBuilder} the contents of the test
*/
void appendTo(BlockBuilder blockBuilder) {
if (configProperties.targetFramework == TestFramework.JUNIT) {
if (isJUnitType()) {
blockBuilder.addLine('@Test')
}
if (ignored) {
blockBuilder.addLine('@Ignore')
blockBuilder.addLine(configProperties.targetFramework.ignoreAnnotation)
}
blockBuilder.addLine(configProperties.targetFramework.methodModifier + "validate_$methodName() throws Exception {")
getMethodBodyBuilder().appendTo(blockBuilder)
@@ -104,26 +108,29 @@ class MethodBuilder {
private MethodBodyBuilder getMethodBodyBuilder() {
if (stubContent.input || stubContent.outputMessage) {
if (configProperties.targetFramework == TestFramework.JUNIT) {
if (isJUnitType()) {
return new JUnitMessagingMethodBodyBuilder(stubContent, configProperties)
}
return new SpockMessagingMethodBodyBuilder(stubContent, configProperties)
}
if (configProperties.testMode == TestMode.JAXRSCLIENT) {
if (configProperties.targetFramework == TestFramework.JUNIT) {
if (isJUnitType()) {
return new JaxRsClientJUnitMethodBodyBuilder(stubContent, configProperties)
}
return new JaxRsClientSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties)
} else if (configProperties.testMode == TestMode.EXPLICIT) {
if (configProperties.targetFramework == TestFramework.JUNIT) {
if (isJUnitType()) {
return new ExplicitJUnitMethodBodyBuilder(stubContent, configProperties)
}
// in Groovy we're using def so we don't have to update the imports
return new MockMvcSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties)
} else if (configProperties.targetFramework == TestFramework.SPOCK) {
} else if (configProperties.targetFramework == SPOCK) {
return new MockMvcSpockMethodRequestProcessingBodyBuilder(stubContent, configProperties)
}
return new MockMvcJUnitMethodBodyBuilder(stubContent, configProperties)
}
private boolean isJUnitType() {
return JUNIT == configProperties.targetFramework || JUNIT5 == configProperties.targetFramework
}
}

View File

@@ -0,0 +1,62 @@
package org.springframework.cloud.contract.verifier.builder.imports
import groovy.transform.CompileStatic
import org.springframework.cloud.contract.verifier.config.TestFramework
import static org.springframework.cloud.contract.verifier.config.TestFramework.CUSTOM
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5
import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK
/**
* Provides imports based on test framework.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class BaseImportProvider {
private static final ImportDefinitions GENERAL_IMPORTS = new ImportDefinitions([], [
'org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat'
])
private static
final Map<TestFramework, ImportDefinitions> TEST_FRAMEWORK_SPECIFIC_IMPORTS = [
(JUNIT) : new ImportDefinitions(['org.junit.Test']),
(JUNIT5): new ImportDefinitions(['org.junit.jupiter.api.Test']),
(SPOCK) : new ImportDefinitions([]),
(CUSTOM): new ImportDefinitions([])]
private static final Map<TestFramework, String> RULE_IMPORT = [
(JUNIT) : 'org.junit.Rule',
(JUNIT5): 'org.junit.jupiter.api.extension.ExtendWith',
(SPOCK) : 'org.junit.Rule',
(CUSTOM): 'org.junit.Rule'
]
/**
* Returns list of imports for provided test framework.
* @param testFramework
* @return list of imports
*/
static List<String> getImports(TestFramework testFramework) {
return GENERAL_IMPORTS.imports + TEST_FRAMEWORK_SPECIFIC_IMPORTS.get(testFramework).imports
}
/**
* Returns list of static imports for provided test framework.
* @param testFramework
* @return
*/
static List<String> getStaticImports(TestFramework testFramework) {
return GENERAL_IMPORTS.staticImports + TEST_FRAMEWORK_SPECIFIC_IMPORTS.get(testFramework).staticImports
}
static String getRuleImport(TestFramework testFramework) {
return RULE_IMPORT.get(testFramework)
}
}

View File

@@ -0,0 +1,76 @@
package org.springframework.cloud.contract.verifier.builder.imports
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.config.TestMode
import static org.springframework.cloud.contract.verifier.config.TestFramework.CUSTOM
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5
import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK
import static org.springframework.cloud.contract.verifier.config.TestMode.EXPLICIT
import static org.springframework.cloud.contract.verifier.config.TestMode.JAXRSCLIENT
import static org.springframework.cloud.contract.verifier.config.TestMode.MOCKMVC
/**
* Provides imports based on test framework and test mode.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
class HttpImportProvider {
private final Map<TestMode, ImportDefinitions> TEST_MODE_SPECIFIC_IMPORTS = [
(JAXRSCLIENT): new ImportDefinitions([], ['javax.ws.rs.client.Entity.*']),
(MOCKMVC) : new ImportDefinitions([], ["${restAssuredPackage}.module.mockmvc.RestAssuredMockMvc.*"]),
(EXPLICIT) : new ImportDefinitions([], ["${restAssuredPackage}.RestAssured.*"])]
private final Map<Tuple2<TestFramework, TestMode>, ImportDefinitions> FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS = [
(new Tuple2(JUNIT, JAXRSCLIENT)) : new ImportDefinitions(['javax.ws.rs.core.Response']),
(new Tuple2(JUNIT5, JAXRSCLIENT)): new ImportDefinitions(['javax.ws.rs.core.Response']),
(new Tuple2(JUNIT, MOCKMVC)) : new ImportDefinitions([
"${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification",
"${restAssuredPackage}.response.ResponseOptions"]),
(new Tuple2(JUNIT5, MOCKMVC)) : new ImportDefinitions([
"${restAssuredPackage}.module.mockmvc.specification.MockMvcRequestSpecification",
"${restAssuredPackage}.response.ResponseOptions"]),
(new Tuple2(JUNIT, EXPLICIT)) : new ImportDefinitions(["${restAssuredPackage}.specification.RequestSpecification",
"${restAssuredPackage}.response.Response"]),
(new Tuple2(JUNIT5, EXPLICIT)) : new ImportDefinitions(["${restAssuredPackage}.specification.RequestSpecification",
"${restAssuredPackage}.response.Response"]),
(new Tuple2(SPOCK, JAXRSCLIENT)) : new ImportDefinitions([]),
(new Tuple2(CUSTOM, JAXRSCLIENT)): new ImportDefinitions([]),
(new Tuple2(SPOCK, MOCKMVC)) : new ImportDefinitions([]),
(new Tuple2(CUSTOM, MOCKMVC)) : new ImportDefinitions([]),
(new Tuple2(SPOCK, EXPLICIT)) : new ImportDefinitions([]),
(new Tuple2(CUSTOM, EXPLICIT)) : new ImportDefinitions([])
]
private final String restAssuredPackage
HttpImportProvider(String restAssuredPackage) {
this.restAssuredPackage = restAssuredPackage
}
/**
* Returns list of imports for http test contracts for provided test framework and test mode.
* @param testFramework
* @param testMode
* @return list of imports
*/
List<String> getImports(TestFramework testFramework, TestMode testMode) {
return TEST_MODE_SPECIFIC_IMPORTS.get(testMode).imports +
FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS.get(new Tuple2(testFramework, testMode)).imports
}
/**
* Returns list of static imports for http test contracts for provided test framework and test mode.
* @param testFramework
* @param testMode
* @return list of static imports
*/
List<String> getStaticImports(TestFramework testFramework, TestMode testMode) {
return TEST_MODE_SPECIFIC_IMPORTS.get(testMode).staticImports +
FRAMEWORK_AND_TEST_MODE_SPECIFIC_IMPORTS.get(new Tuple2(testFramework, testMode)).staticImports
}
}

View File

@@ -0,0 +1,22 @@
package org.springframework.cloud.contract.verifier.builder.imports
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
/**
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
@PackageScope
class ImportDefinitions {
final List<String> imports
final List<String> staticImports
ImportDefinitions(List<String> imports, List<String> staticImports = []) {
this.imports = imports
this.staticImports = staticImports
}
}

View File

@@ -0,0 +1,32 @@
package org.springframework.cloud.contract.verifier.builder.imports
import groovy.transform.CompileStatic
/**
* Provides imports based on test framework and test mode.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class MessagingImportProvider {
/**
* @return list of imports for messaging test contracts.
*/
static List<String> getImports() {
return ['javax.inject.Inject',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage',
'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging',
]
}
/**
* @return list of static imports for messaging test contracts.
*/
static List<String> getStaticImports() {
return ['org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers']
}
}

View File

@@ -16,68 +16,105 @@
package org.springframework.cloud.contract.verifier.config
import org.springframework.cloud.contract.verifier.config.framework.CustomDefinition
import org.springframework.cloud.contract.verifier.config.framework.JUnit5Definition
import org.springframework.cloud.contract.verifier.config.framework.JUnitDefinition
import org.springframework.cloud.contract.verifier.config.framework.SpockDefinition
import org.springframework.cloud.contract.verifier.config.framework.TestFrameworkDefinition
/**
* Contains main building blocks for a test class for the given framework
*
* @author Jakub Kubrynski, codearte.io
* @author Olga Maciaszek-Sharma
*
* @since 1.0.0
*/
enum TestFramework {
JUNIT("public ", "public void ", ";", ".java", "Test", "org.junit.Ignore", ["org.junit.FixMethodOrder", "org.junit.runners.MethodSorters"], "@FixMethodOrder(MethodSorters.NAME_ASCENDING)"),
SPOCK("", "def ", "", ".groovy", "Spec", "spock.lang.Ignore", ["spock.lang.Stepwise"], "@Stepwise"),
CUSTOM("", "", "", "", "", "", [], "")
private final String classModifier
private final String methodModifier
private final String lineSuffix
private final String classExtension
private final String classNameSuffix
private final String ignoreClass
private final List<String> orderAnnotationImports
private final String orderAnnotation
SPOCK(new SpockDefinition()),
JUNIT(new JUnitDefinition()),
JUNIT5(new JUnit5Definition()),
CUSTOM(new CustomDefinition())
@Delegate
private final TestFrameworkDefinition testFrameworkDefinition
TestFramework(TestFrameworkDefinition testFrameworkDefinition) {
this.testFrameworkDefinition = testFrameworkDefinition
}
/**
* @deprecated use {@link #TestFramework(TestFrameworkDefinition)}
* @param classModifier
* @param methodModifier
* @param lineSuffix
* @param classExtension
* @param classNameSuffix
* @param ignoreClass
* @param orderAnnotationImports
* @param orderAnnotation
*/
@Deprecated
TestFramework(String classModifier, String methodModifier, String lineSuffix, String classExtension, String classNameSuffix,
String ignoreClass, List<String> orderAnnotationImports, String orderAnnotation) {
this.classModifier = classModifier
this.lineSuffix = lineSuffix
this.methodModifier = methodModifier
this.classExtension = classExtension
this.classNameSuffix = classNameSuffix
this.ignoreClass = ignoreClass
this.orderAnnotationImports = orderAnnotationImports
this.orderAnnotation = orderAnnotation
}
testFrameworkDefinition = new TestFrameworkDefinition() {
String getClassModifier() {
return classModifier
}
@Override
String getClassModifier() {
return classModifier
}
String getMethodModifier() {
return methodModifier
}
@Override
String getMethodModifier() {
return methodModifier
}
String getLineSuffix() {
return lineSuffix
}
@Override
String getLineSuffix() {
return lineSuffix
}
String getClassExtension() {
return classExtension
}
@Override
String getClassExtension() {
return classExtension
}
String getClassNameSuffix() {
return classNameSuffix
}
@Override
String getClassNameSuffix() {
return classNameSuffix
}
String getIgnoreClass() {
return ignoreClass
}
@Override
String getIgnoreClass() {
return ignoreClass
}
List<String> getOrderAnnotationImport() {
return orderAnnotationImports
}
@Override
List<String> getOrderAnnotationImports() {
return orderAnnotationImports
}
String getOrderAnnotation() {
return orderAnnotation
@Override
String getOrderAnnotation() {
return orderAnnotation
}
@Override
String getIgnoreAnnotation() {
return '@Ignore'
}
@Override
boolean annotationLevelRules() {
return false
}
@Override
String getRuleAnnotation(String annotationValue) {
throw new UnsupportedOperationException('Not available in framework.')
}
}
}
}

View File

@@ -0,0 +1,69 @@
package org.springframework.cloud.contract.verifier.config.framework
import groovy.transform.CompileStatic
/**
* Defines elements characteristic of Custom test framework to be used during test class construction.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class CustomDefinition implements TestFrameworkDefinition {
@Override
String getClassModifier() {
return ''
}
@Override
String getMethodModifier() {
return ''
}
@Override
String getLineSuffix() {
return ''
}
@Override
String getClassExtension() {
return ''
}
@Override
String getClassNameSuffix() {
return ''
}
@Override
String getIgnoreClass() {
return ''
}
@Override
List<String> getOrderAnnotationImports() {
return []
}
@Override
String getOrderAnnotation() {
return ''
}
@Override
String getIgnoreAnnotation() {
return '@Ignore'
}
@Override
boolean annotationLevelRules() {
return false
}
@Override
String getRuleAnnotation(String annotationValue) {
throw new UnsupportedOperationException('Not available in framework.')
}
}

View File

@@ -0,0 +1,69 @@
package org.springframework.cloud.contract.verifier.config.framework
import groovy.transform.CompileStatic
/**
* Defines elements characteristic of JUnit5 test framework to be used during test class construction.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class JUnit5Definition implements TestFrameworkDefinition {
@Override
String getClassModifier() {
return 'public '
}
@Override
String getMethodModifier() {
return 'public void '
}
@Override
String getLineSuffix() {
return ';'
}
@Override
String getClassExtension() {
'.java'
}
@Override
String getClassNameSuffix() {
return 'Test'
}
@Override
String getIgnoreClass() {
return 'org.junit.jupiter.api.Disabled'
}
@Override
List<String> getOrderAnnotationImports() {
throw new UnsupportedOperationException('Not implemented yet in JUnit5 - https://github.com/junit-team/junit5/issues/48')
}
@Override
String getOrderAnnotation() {
throw new UnsupportedOperationException('Not implemented yet in JUnit5 - https://github.com/junit-team/junit5/issues/48')
}
@Override
String getIgnoreAnnotation() {
return '@Disabled'
}
@Override
boolean annotationLevelRules() {
return true
}
@Override
String getRuleAnnotation(String annotationValue) {
return ("@ExtendWith(${annotationValue}.class)")
}
}

View File

@@ -0,0 +1,69 @@
package org.springframework.cloud.contract.verifier.config.framework
import groovy.transform.CompileStatic
/**
* Defines elements characteristic of JUnit test framework to be used during test class construction.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class JUnitDefinition implements TestFrameworkDefinition {
@Override
String getClassModifier() {
return 'public '
}
@Override
String getMethodModifier() {
return 'public void '
}
@Override
String getLineSuffix() {
return ';'
}
@Override
String getClassExtension() {
return '.java'
}
@Override
String getClassNameSuffix() {
return 'Test'
}
@Override
String getIgnoreClass() {
return 'org.junit.Ignore'
}
@Override
List<String> getOrderAnnotationImports() {
return ['org.junit.FixMethodOrder', 'org.junit.runners.MethodSorters']
}
@Override
String getOrderAnnotation() {
return '@FixMethodOrder(MethodSorters.NAME_ASCENDING)'
}
@Override
String getIgnoreAnnotation() {
return '@Ignore'
}
@Override
boolean annotationLevelRules() {
return false
}
@Override
String getRuleAnnotation(String annotationValue) {
throw new UnsupportedOperationException('Not available in JUnit.')
}
}

View File

@@ -0,0 +1,69 @@
package org.springframework.cloud.contract.verifier.config.framework
import groovy.transform.CompileStatic
/**
* Defines elements characteristic of Spock test framework to be used during test class construction.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
class SpockDefinition implements TestFrameworkDefinition {
@Override
String getClassModifier() {
return ''
}
@Override
String getMethodModifier() {
return 'def '
}
@Override
String getLineSuffix() {
return ''
}
@Override
String getClassExtension() {
return '.groovy'
}
@Override
String getClassNameSuffix() {
return 'Spec'
}
@Override
String getIgnoreClass() {
return 'spock.lang.Ignore'
}
@Override
List<String> getOrderAnnotationImports() {
return ['spock.lang.Stepwise']
}
@Override
String getOrderAnnotation() {
return '@Stepwise'
}
@Override
String getIgnoreAnnotation() {
return '@Ignore'
}
@Override
boolean annotationLevelRules() {
return false
}
@Override
String getRuleAnnotation(String annotationValue) {
throw new UnsupportedOperationException('Not available in Spock.')
}
}

View File

@@ -0,0 +1,75 @@
package org.springframework.cloud.contract.verifier.config.framework
import groovy.transform.CompileStatic
/**
* Defines elements characteristic of a given test framework to be used during test class construction.
*
* @author Olga Maciaszek-Sharma
*
* @since 2.1.0
*/
@CompileStatic
interface TestFrameworkDefinition {
/**
* Returns the class access level modifier. E.g. for Java tests that would mean {@code public}
**/
String getClassModifier()
/**
* Returns the method access level modifier along with the return type.
* E.g. for Java tests that would mean {@code public void}
**/
String getMethodModifier()
/**
* Returns the characters that should end each line. E.g. for Java tests that would mean {@code ;}
**/
String getLineSuffix()
/**
* Returns the file extension. E.g. for Java tests that would be {@code .java}
**/
String getClassExtension()
/**
* Returns the test class name suffix. E.g. for JUnit tests that would be {@code Test}
**/
String getClassNameSuffix()
/**
* Returns the qualified name of the class used to ignore or disable tests. E.g. for JUnit 4 tests that would
* be {@code org.junit.Ignore}
**/
String getIgnoreClass()
/**
* Returns the qualified names of the classes that are used for arranging tests into scenarios.
* E.g. for JUnit 4 tests that would be {@code 'org.junit.FixMethodOrder'}, {@code 'org.junit.runners.MethodSorters'}
**/
List<String> getOrderAnnotationImports()
/**
* Returns the annotation used for arranging tests into scenarios.
* E.g. for JUnit test that would be {@code @FixMethodOrder(MethodSorters.NAME_ASCENDING)}
**/
String getOrderAnnotation()
/**
* Returns the annotation used for ignoring or disabling tests. E.g. for JUnit tests that would mean {@code @Ignore}
**/
String getIgnoreAnnotation()
/**
* Returns a boolean indicating whether an annotation-type rule or extension is being used or not.
* E.g. for JUnit 5 tests that would return {@code true}
**/
boolean annotationLevelRules()
/**
* Returns the test rule or extension annotation with the {@annotationValue} passed as an argument.
* E.g. for JUnit 5 tests that could be {@code @ExtendWith(Example.class)}
**/
String getRuleAnnotation(String annotationValue)
}

View File

@@ -16,10 +16,12 @@
package org.springframework.cloud.contract.verifier
import spock.lang.Specification
import org.springframework.cloud.contract.verifier.builder.JavaTestGenerator
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.config.TestFramework
import spock.lang.Specification
import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK
class GeneratorScannerSpec extends Specification {
@@ -39,7 +41,7 @@ class GeneratorScannerSpec extends Specification {
def "should create class with full package"() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(targetFramework: TestFramework.SPOCK)
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(targetFramework: SPOCK)
properties.contractsDslDir = new File(this.getClass().getResource("/directory/with/stubs/package").toURI())
TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver))
when:

View File

@@ -18,17 +18,23 @@ package org.springframework.cloud.contract.verifier.builder
import org.junit.Rule
import org.junit.rules.TemporaryFolder
import spock.lang.Issue
import spock.lang.Specification
import org.springframework.cloud.contract.verifier.TestGenerator
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.config.TestMode
import org.springframework.cloud.contract.verifier.file.ContractMetadata
import org.springframework.cloud.contract.verifier.util.SyntaxChecker
import org.springframework.util.StringUtils
import spock.lang.Issue
import spock.lang.Specification
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT
import static org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5
import static org.springframework.cloud.contract.verifier.config.TestFramework.SPOCK
import static org.springframework.cloud.contract.verifier.config.TestMode.EXPLICIT
import static org.springframework.cloud.contract.verifier.config.TestMode.JAXRSCLIENT
import static org.springframework.cloud.contract.verifier.config.TestMode.MOCKMVC
import static org.springframework.cloud.contract.verifier.util.ContractVerifierDslConverter.convertAsCollection
class SingleTestGeneratorSpec extends Specification {
@@ -49,7 +55,6 @@ class SingleTestGeneratorSpec extends Specification {
'@FixMethodOrder(MethodSorters.NAME_ASCENDING)', '@Test', '@Ignore', 'import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;',
'import io.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static final List<String> explicitJUnitRestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;',
'import org.junit.FixMethodOrder;', 'import org.junit.Ignore;', 'import org.junit.Test;', 'import org.junit.runners.MethodSorters;',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.RestAssured.*;',
@@ -62,6 +67,34 @@ class SingleTestGeneratorSpec extends Specification {
'@FixMethodOrder(MethodSorters.NAME_ASCENDING)', '@Test', '@Ignore', 'import io.restassured.specification.RequestSpecification;',
'import io.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static
final List<String> mockMvcJUnit5RestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;',
'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.*;',
'@Test', '@Disabled', 'import com.jayway.restassured.module.mockmvc.specification.MockMvcRequestSpecification;',
'import com.jayway.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static
final List<String> mockMvcJUnit5RestAssured3ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;',
'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;',
'@Test', '@Disabled', 'import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;',
'import io.restassured.response.ResponseOptions;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static
final List<String> explicitJUnit5RestAssured2ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;',
'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static com.jayway.restassured.RestAssured.*;',
'@Test', '@Disabled', 'import com.jayway.restassured.specification.RequestSpecification;',
'import com.jayway.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static
final List<String> explicitJUnit5RestAssured3ClassStrings = ['import com.jayway.jsonpath.DocumentContext;', 'import com.jayway.jsonpath.JsonPath;',
'import org.junit.jupiter.api.Disabled;', 'import org.junit.jupiter.api.Test;',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson;', 'import static io.restassured.RestAssured.*;',
'@Test', '@Disabled', 'import io.restassured.specification.RequestSpecification;',
'import io.restassured.response.Response;', 'import static org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat']
private static final List<String> spockClassRestAssured2Strings = ['import com.jayway.jsonpath.DocumentContext', 'import com.jayway.jsonpath.JsonPath',
'import spock.lang.Ignore', 'import spock.lang.Specification', 'import spock.lang.Stepwise',
'import static com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson', 'import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.*',
@@ -85,23 +118,23 @@ class SingleTestGeneratorSpec extends Specification {
public static final Closure JAVA_ASSERTER = { String classToTest ->
String name = Math.abs(new Random().nextInt())
String changedTest = classToTest
.replace("public class Test", "public class Test${name}")
.replace("public class ContractsTest", "public class Test${name}")
.replace('public class Test', "public class Test${name}")
.replace('public class ContractsTest', "public class Test${name}")
String fqn = FQN(classToTest)
SyntaxChecker.tryToCompileJavaWithoutImports("${fqn}${name}", changedTest)
}
static String FQN(String classToTest) {
return classToTest.contains("0_1_0_dev_1_uncommitted_d1174dd") ?
"org.springframework.cloud.contract.verifier.tests.com_uscm.dale_api44_spec._0_1_0_dev_1_uncommitted_d1174dd.Test" :
"test.Test"
return classToTest.contains('0_1_0_dev_1_uncommitted_d1174dd') ?
'org.springframework.cloud.contract.verifier.tests.com_uscm.dale_api44_spec._0_1_0_dev_1_uncommitted_d1174dd.Test' :
'test.Test'
}
public static final Closure JAVA_JAXRS_ASSERTER = { String classToTest ->
String name = Math.abs(new Random().nextInt())
String changedTest = classToTest
.replace("public class Test {", "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n")
.replace("public class ContractsTest {", "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n")
.replace('public class Test {', "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n")
.replace('public class ContractsTest {', "public class Test${name} {\njavax.ws.rs.client.WebTarget webTarget;\n")
String fqn = FQN(classToTest)
SyntaxChecker.tryToCompileJavaWithoutImports("${fqn}${name}", changedTest)
}
@@ -112,11 +145,11 @@ class SingleTestGeneratorSpec extends Specification {
def setup() {
file = tmpFolder.newFile()
wiriteContract(file)
writeContract(file)
}
private wiriteContract(File file) {
file.write("""
private writeContract(File file) {
file.write('''
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
@@ -126,70 +159,72 @@ class SingleTestGeneratorSpec extends Specification {
status OK()
}
}
""")
''')
}
def "should build test class for #testFramework"() {
def 'should build test class for #testFramework'() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
properties.testMode = mode
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file))
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order, convertAsCollection(new File('/'), file))
contract.ignored >> true
contract.order >> 2
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
classStrings.each { assert clazz.contains(it) }
and:
asserter(clazz)
where:
testFramework | mode | classStrings | asserter
JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER
JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER
SPOCK | TestMode.MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER
SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured3ClassStrings | GROOVY_ASSERTER
testFramework | order | mode | classStrings | asserter
JUNIT | 2 | MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER
JUNIT | 2 | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER
JUNIT5 | null | MOCKMVC | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER
JUNIT5 | null | TestMode.EXPLICIT | explicitJUnit5RestAssured3ClassStrings | JAVA_ASSERTER
SPOCK | 2 | MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER
SPOCK | 2 | TestMode.EXPLICIT | explicitSpockRestAssured3ClassStrings | GROOVY_ASSERTER
}
def "should build test class for #testFramework when the path contains bizarre signs"() {
def 'should build test class for #testFramework when the path contains bizarre signs'() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
properties.basePackageForTests = "org.springframework.cloud.contract.verifier.tests"
properties.basePackageForTests = 'org.springframework.cloud.contract.verifier.tests'
and:
File newFolder = tmpFolder.newFolder("META_INF")
File subfolders = new File(newFolder, "/com.uscm/dale_api44_spec/0.1.0_dev.1.uncommitted+d1174dd/contracts/")
File newFolder = tmpFolder.newFolder('META_INF')
File subfolders = new File(newFolder, '/com.uscm/dale_api44_spec/0.1.0_dev.1.uncommitted+d1174dd/contracts/')
subfolders.mkdirs()
File newFile = new File(subfolders, "contract.groovy")
File newFile = new File(subfolders, 'contract.groovy')
newFile.createNewFile()
wiriteContract(newFile)
writeContract(newFile)
properties.contractsDslDir = newFolder
properties.generatedTestSourcesDir = newFolder.parentFile
when:
int size = new TestGenerator(properties).generate()
then:
size > 0
asserter(new File(newFolder.parent, "/org/springframework/cloud/contract/verifier/tests/com_uscm/dale_api44_spec/0_1_0_dev_1_uncommitted_d1174dd/${testName}").text)
asserter(new File(newFolder.parent, '/org/springframework/cloud/contract/verifier/tests/com_uscm/dale_api44_spec/0_1_0_dev_1_uncommitted_d1174dd/' + testName).text)
where:
testFramework | mode | asserter | testName
JUNIT | TestMode.MOCKMVC | JAVA_ASSERTER | "ContractsTest.java"
JUNIT | TestMode.EXPLICIT | JAVA_ASSERTER | "ContractsTest.java"
SPOCK | TestMode.MOCKMVC | GROOVY_ASSERTER | "ContractsSpec.groovy"
SPOCK | TestMode.EXPLICIT | GROOVY_ASSERTER | "ContractsSpec.groovy"
JUNIT | MOCKMVC | JAVA_ASSERTER | 'ContractsTest.java'
JUNIT | TestMode.EXPLICIT | JAVA_ASSERTER | 'ContractsTest.java'
JUNIT5 | MOCKMVC | JAVA_ASSERTER | 'ContractsTest.java'
JUNIT5 | TestMode.EXPLICIT | JAVA_ASSERTER | 'ContractsTest.java'
SPOCK | MOCKMVC | GROOVY_ASSERTER | 'ContractsSpec.groovy'
SPOCK | TestMode.EXPLICIT | GROOVY_ASSERTER | 'ContractsSpec.groovy'
}
def "should build test class for #testFramework with Rest Assured 2.x"() {
def 'should build test class for #testFramework with Rest Assured 2.x'() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
properties.testMode = mode
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2,
convertAsCollection(new File("/"),file) )
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order,
convertAsCollection(new File('/'), file))
contract.ignored >> true
contract.order >> 2
JavaTestGenerator testGenerator = new JavaTestGenerator(checker: new ClassPresenceChecker() {
@Override
boolean isClassPresent(String className) {
@@ -198,25 +233,27 @@ class SingleTestGeneratorSpec extends Specification {
})
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
classStrings.each { assert clazz.contains(it) }
clazz.contains("com.jayway.restassured")
!clazz.contains("io.restassured")
clazz.contains('com.jayway.restassured')
!clazz.contains('io.restassured')
where:
testFramework | mode | classStrings
JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured2ClassStrings
JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured2ClassStrings
SPOCK | TestMode.MOCKMVC | spockClassRestAssured2Strings
SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings
testFramework | order | mode | classStrings
JUNIT | 2 | MOCKMVC | mockMvcJUnitRestAssured2ClassStrings
JUNIT | 2 | TestMode.EXPLICIT | explicitJUnitRestAssured2ClassStrings
JUNIT5 | null | MOCKMVC | mockMvcJUnit5RestAssured2ClassStrings
JUNIT5 | null | TestMode.EXPLICIT | explicitJUnit5RestAssured2ClassStrings
SPOCK | 2 | MOCKMVC | spockClassRestAssured2Strings
SPOCK | 2 | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings
}
def "should build test class for #testFramework and mode #mode with two files"() {
def 'should build test class for #testFramework and mode #mode with two files'() {
given:
File file = tmpFolder.newFile()
file.write("""
file.write('''
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
@@ -233,10 +270,10 @@ class SingleTestGeneratorSpec extends Specification {
}
}
}
""")
''')
and:
File file2 = tmpFolder.newFile()
file2.write("""
file2.write('''
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
@@ -253,22 +290,22 @@ class SingleTestGeneratorSpec extends Specification {
}
}
}
""")
''')
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(file.toPath(), false, 1, null,
convertAsCollection(new File("/"),file) )
convertAsCollection(new File('/'), file))
contract.ignored >> false
and:
ContractMetadata contract2 = new ContractMetadata(file2.toPath(), false, 1, null,
convertAsCollection(new File("/"),file2) )
convertAsCollection(new File('/'), file2))
contract2.ignored >> false
and:
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract, contract2], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract, contract2], 'test', 'test', 'com/foo')
then:
classStrings.each { clazz.contains(it) }
@@ -277,25 +314,26 @@ class SingleTestGeneratorSpec extends Specification {
and:
textAssertion(clazz)
where:
testFramework | mode | classStrings | asserter | textAssertion
JUNIT | TestMode.MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tMockMvcRequestSpecification") == 2 }
JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tMockMvcRequestSpecification") == 2 }
SPOCK | TestMode.MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tdef request") == 2 }
SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings | GROOVY_ASSERTER | { String test -> StringUtils.countOccurrencesOf(test, "\t\t\tdef request") == 2 }
testFramework | mode | classStrings | asserter | textAssertion
JUNIT | MOCKMVC | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2}
JUNIT | TestMode.EXPLICIT | explicitJUnitRestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2}
JUNIT5 | MOCKMVC | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2}
JUNIT5 | TestMode.EXPLICIT | explicitJUnit5RestAssured3ClassStrings | JAVA_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tMockMvcRequestSpecification') == 2}
SPOCK | MOCKMVC | spockClassRestAssured3Strings | GROOVY_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tdef request') == 2}
SPOCK | TestMode.EXPLICIT | explicitSpockRestAssured2ClassStrings | GROOVY_ASSERTER | {String test -> StringUtils.countOccurrencesOf(test, '\t\t\tdef request') == 2}
}
def "should build JaxRs test class for #testFramework"() {
def 'should build JaxRs test class for #testFramework'() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.testMode = TestMode.JAXRSCLIENT
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file))
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, null, convertAsCollection(new File('/'), file))
contract.ignored >> true
contract.order >> 2
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
classStrings.each { clazz.contains(it) }
@@ -304,15 +342,16 @@ class SingleTestGeneratorSpec extends Specification {
asserter(clazz)
where:
testFramework | classStrings | asserter
JUNIT | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER
SPOCK | ['import static javax.ws.rs.client.Entity.*'] | GROOVY_ASSERTER
testFramework | classStrings | asserter
JUNIT | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER
JUNIT5 | ['import static javax.ws.rs.client.Entity.*', 'import javax.ws.rs.core.Response'] | JAVA_JAXRS_ASSERTER
SPOCK | ['import static javax.ws.rs.client.Entity.*'] | GROOVY_ASSERTER
}
def "should work if there is messaging and rest in one folder #testFramework"() {
def 'should work if there is messaging and rest in one folder #testFramework'() {
given:
File secondFile = tmpFolder.newFile()
secondFile.write("""
secondFile.write('''
org.springframework.cloud.contract.spec.Contract.make {
ignored()
label 'some_label'
@@ -327,22 +366,20 @@ class SingleTestGeneratorSpec extends Specification {
assertThat('hashCode()')
}
}
""")
''')
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 2, convertAsCollection(new File("/"),file))
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, order, convertAsCollection(new File('/'), file))
contract.ignored >> true
contract.order >> 2
and:
ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, 2, convertAsCollection(new File("/"),secondFile))
ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, order, convertAsCollection(new File('/'), secondFile))
contract2.ignored >> true
contract2.order >> 2
and:
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract, contract2], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract, contract2], 'test', 'test', 'com/foo')
then:
classStrings.each { clazz.contains(it) }
@@ -352,16 +389,17 @@ class SingleTestGeneratorSpec extends Specification {
asserter(clazz)
where:
testFramework | classStrings | asserter
JUNIT | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER
SPOCK | spockClassRestAssured3Strings | GROOVY_ASSERTER
testFramework | order | classStrings | asserter
JUNIT | 2 | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER
JUNIT5 | null | mockMvcJUnit5RestAssured3ClassStrings | JAVA_ASSERTER
SPOCK | 2 | spockClassRestAssured3Strings | GROOVY_ASSERTER
}
@Issue('#30')
def "should ignore a test if the contract is ignored in the dsl"() {
def 'should ignore a test if the contract is ignored in the dsl'() {
given:
File secondFile = tmpFolder.newFile()
secondFile.write("""
secondFile.write('''
org.springframework.cloud.contract.spec.Contract.make {
ignored()
request {
@@ -372,37 +410,37 @@ class SingleTestGeneratorSpec extends Specification {
status OK()
}
}
""")
''')
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = testFramework
and:
ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, 2, convertAsCollection(new File("/"),file))
ContractMetadata contract2 = new ContractMetadata(secondFile.toPath(), true, 1, order, convertAsCollection(new File('/'), file))
contract2.ignored >> false
contract2.order >> 2
and:
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract2], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract2], 'test', 'test', 'com/foo')
then:
classStrings.each { clazz.contains(it) }
clazz.contains('@Ignore')
clazz.contains(ignoreAnnotation)
and:
asserter(clazz)
where:
testFramework | classStrings | asserter
JUNIT | mockMvcJUnitRestAssured3ClassStrings | JAVA_ASSERTER
SPOCK | spockClassRestAssured3Strings | GROOVY_ASSERTER
testFramework | order | classStrings | ignoreAnnotation | asserter
JUNIT | 2 | mockMvcJUnitRestAssured3ClassStrings | '@Ignore' | JAVA_ASSERTER
JUNIT5 | null | mockMvcJUnit5RestAssured3ClassStrings | '@Disabled' | JAVA_ASSERTER
SPOCK | 2 | spockClassRestAssured3Strings | '@Ignore' | GROOVY_ASSERTER
}
@Issue('#117')
def "should generate test in explicit test mode using JUnit"() {
def 'should generate test in explicit test mode using JUnit'() {
given:
String baseClass = """
String baseClass = '''
// tag::context_path_baseclass[]
import io.restassured.RestAssured;
import org.junit.Before;
@@ -421,11 +459,11 @@ class SingleTestGeneratorSpec extends Specification {
}
}
// end::context_path_baseclass[]
"""
SyntaxChecker.tryToCompileJavaWithoutImports("test.ContextPathTestingBaseClass", "package test;\n${baseClass}")
'''
SyntaxChecker.tryToCompileJavaWithoutImports('test.ContextPathTestingBaseClass', "package test;\n${baseClass}")
and:
File secondFile = tmpFolder.newFile()
secondFile.write("""
secondFile.write('''
// tag::context_path_contract[]
org.springframework.cloud.contract.spec.Contract.make {
request {
@@ -437,28 +475,28 @@ class SingleTestGeneratorSpec extends Specification {
}
}
// end::context_path_contract[]
""")
''')
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = JUNIT
properties.testMode = TestMode.EXPLICIT
properties.baseClassForTests = "test.ContextPathTestingBaseClass"
properties.baseClassForTests = 'test.ContextPathTestingBaseClass'
and:
ContractMetadata contract = new ContractMetadata(file.toPath(), false, 1,
null, convertAsCollection(new File("/"),file))
null, convertAsCollection(new File('/'), file))
and:
SingleTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
clazz.contains("RequestSpecification request = given();")
clazz.contains("Response response = given().spec(request)")
clazz.contains('RequestSpecification request = given();')
clazz.contains('Response response = given().spec(request)')
}
def "should pick the contract's name as the test method"() {
given:
File secondFile = tmpFolder.newFile()
secondFile.write("""
secondFile.write('''
org.springframework.cloud.contract.spec.Contract.make {
name("MySuperMethod")
request {
@@ -469,18 +507,18 @@ class SingleTestGeneratorSpec extends Specification {
status OK()
}
}
""")
''')
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties();
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile))
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile))
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
clazz.contains("validate_mySuperMethod()")
clazz.contains('validate_mySuperMethod()')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
def "should pick the contract's name as the test method when there are multiple contracts"() {
@@ -505,18 +543,18 @@ class SingleTestGeneratorSpec extends Specification {
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties();
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile))
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile))
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
clazz.contains("validate_shouldHaveIndex1()")
clazz.contains("validate_shouldHaveIndex2()")
clazz.contains('validate_shouldHaveIndex1()')
clazz.contains('validate_shouldHaveIndex2()')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
def "should generate the test method when there are multiple contracts without name field"() {
def 'should generate the test method when there are multiple contracts without name field'() {
given:
File secondFile = tmpFolder.newFile()
secondFile.write('''
@@ -537,26 +575,26 @@ class SingleTestGeneratorSpec extends Specification {
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties();
properties.targetFramework = testFramework
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File("/"),secondFile))
ContractMetadata contract = new ContractMetadata(secondFile.toPath(), false, 1, null, convertAsCollection(new File('/'), secondFile))
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
String clazz = testGenerator.buildClass(properties, [contract], "test", "test", 'com/foo')
String clazz = testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
clazz.contains("_0() throws Exception")
clazz.contains("_1() throws Exception")
clazz.contains('_0() throws Exception')
clazz.contains('_1() throws Exception')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
@Issue("#359")
def "should generate tests from a contract that references a file for [#testFramework]"() {
@Issue('#359')
def 'should generate tests from a contract that references a file for [#testFramework]'() {
given:
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI())
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI())
File temp = tmpFolder.newFolder()
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(
targetFramework: testFramework, contractsDslDir: contractLocation.parentFile,
basePackageForTests: "a.b",
basePackageForTests: 'a.b',
generatedTestSourcesDir: temp
)
TestGenerator testGenerator = new TestGenerator(properties)
@@ -565,22 +603,22 @@ class SingleTestGeneratorSpec extends Specification {
then:
count == 1
and:
String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text
test.contains("REQUEST")
test.contains("RESPONSE")
String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text
test.contains('REQUEST')
test.contains('RESPONSE')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
@Issue("#260")
def "should generate tests in a folder taken from basePackageForTests when it is set for [#testFramework]"() {
@Issue('#260')
def 'should generate tests in a folder taken from basePackageForTests when it is set for [#testFramework]'() {
given:
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI())
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI())
File temp = tmpFolder.newFolder()
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(
targetFramework: testFramework, contractsDslDir: contractLocation.parentFile,
basePackageForTests: "a.b", generatedTestSourcesDir: temp
basePackageForTests: 'a.b', generatedTestSourcesDir: temp
)
TestGenerator testGenerator = new TestGenerator(properties)
when:
@@ -588,22 +626,22 @@ class SingleTestGeneratorSpec extends Specification {
then:
count == 1
and:
String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text
test.contains("REQUEST")
test.contains("RESPONSE")
String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text
test.contains('REQUEST')
test.contains('RESPONSE')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
@Issue("#260")
@Issue('#260')
def "should generate tests in a folder taken from baseClassForTests's package when it is set for [#testFramework]"() {
given:
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI())
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI())
File temp = tmpFolder.newFolder()
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(
targetFramework: testFramework, contractsDslDir: contractLocation.parentFile,
baseClassForTests: "a.b.SomeClass", generatedTestSourcesDir: temp
baseClassForTests: 'a.b.SomeClass', generatedTestSourcesDir: temp
)
TestGenerator testGenerator = new TestGenerator(properties)
when:
@@ -611,22 +649,22 @@ class SingleTestGeneratorSpec extends Specification {
then:
count == 1
and:
String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text
test.contains("REQUEST")
test.contains("RESPONSE")
String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text
test.contains('REQUEST')
test.contains('RESPONSE')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
@Issue("#260")
def "should generate tests in a folder taken from packageWithBaseClasses when it is set for [#testFramework]"() {
@Issue('#260')
def 'should generate tests in a folder taken from packageWithBaseClasses when it is set for [#testFramework]'() {
given:
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI())
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI())
File temp = tmpFolder.newFolder()
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(
targetFramework: testFramework, contractsDslDir: contractLocation.parentFile,
packageWithBaseClasses: "a.b", generatedTestSourcesDir: temp
packageWithBaseClasses: 'a.b', generatedTestSourcesDir: temp
)
TestGenerator testGenerator = new TestGenerator(properties)
when:
@@ -634,17 +672,17 @@ class SingleTestGeneratorSpec extends Specification {
then:
count == 1
and:
String test = new File(temp, "a/b/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text
test.contains("REQUEST")
test.contains("RESPONSE")
String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text
test.contains('REQUEST')
test.contains('RESPONSE')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
@Issue("#260")
def "should generate tests in a default folder when no property was passed for [#testFramework]"() {
@Issue('#260')
def 'should generate tests in a default folder when no property was passed for [#testFramework]'() {
given:
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource("/classpath/readFromFile.groovy").toURI())
File contractLocation = new File(SingleTestGeneratorSpec.class.getResource('/classpath/readFromFile.groovy').toURI())
File temp = tmpFolder.newFolder()
and:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(
@@ -657,14 +695,29 @@ class SingleTestGeneratorSpec extends Specification {
then:
count == 1
and:
String test = new File(temp, "org/springframework/cloud/contract/verifier/tests/ContractVerifier" + (testFramework == JUNIT ? "Test.java" : "Spec.groovy")).text
test.contains("REQUEST")
test.contains("RESPONSE")
String test = new File(temp, "org/springframework/cloud/contract/verifier/tests/ContractVerifier${getTestName(testFramework)}").text
test.contains('REQUEST')
test.contains('RESPONSE')
where:
testFramework << [JUNIT, SPOCK]
testFramework << [JUNIT, JUNIT5, SPOCK]
}
def 'should throw exception in JUnit5 when contract belongs to scenario'() {
given:
ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties()
properties.targetFramework = JUNIT5
properties.testMode = mode
ContractMetadata contract = new ContractMetadata(file.toPath(), true, 1, 1, convertAsCollection(new File('/'), file))
JavaTestGenerator testGenerator = new JavaTestGenerator()
when:
testGenerator.buildClass(properties, [contract], 'test', 'test', 'com/foo')
then:
thrown(UnsupportedOperationException)
where:
mode << [MOCKMVC, EXPLICIT, JAXRSCLIENT]
}
private static String getTestName(TestFramework testFramework) {
testFramework == SPOCK ? 'Spec.groovy' : 'Test.java'
}
}