Tho*_*hom 5 groovy intellij-idea gradle spock
使用 IntelliJ IDEA 中的 groovy Spock 单元测试设置新的 Spring Boot Java 项目。我无法运行我的第一个单元测试。我从 IntelliJ 内部创建了它,它位于 src/test/groovy 下。
这是单元测试。
package com.heavyweightsoftware.orders.pojo
import com.heavyweightsoftware.util.FixedDecimal
import spock.lang.Specification
class ItemOrderedTest extends Specification {
public static final String ITEM_ID = "OU812"
public static final String ITEM_NAME = "Eddie V."
public static final int ITEM_QUANTITY = 5
public static final FixedDecimal ITEM_UNIT_PRICE = new FixedDecimal(35.62, 2)
static ItemOrdered getItemOrdered() {
ItemOrdered result = new ItemOrdered()
result.itemId = ITEM_ID
result.quantity = ITEM_QUANTITY
result.itemName = ITEM_NAME
result.unitPrice = ITEM_UNIT_PRICE
return result;
}
def "GetQuantity"() {
given: "A test item"
ItemOrdered testItem = getItemOrdered()
when: "Getting Value"
int result = testItem.quantity
then: "Should be correct"
result == ITEM_QUANTITY
}
def "GetItemId"() {
given: "A test item"
ItemOrdered testItem = getItemOrdered()
when: "Getting Value"
String result = testItem.itemId
then: "Should be correct"
result == ITEM_ID
}
def "GetItemName"() {
given: "A test item"
ItemOrdered testItem = getItemOrdered()
when: "Getting Value"
String result = testItem.itemName
then: "Should be correct"
result == ITEM_NAME
}
def "GetLineTotal"() {
given: "A test item"
ItemOrdered testItem = getItemOrdered()
when: "Getting Total"
FixedDecimal result = testItem.lineTotal
then: "Should be correct"
FixedDecimal total = new FixedDecimal(178.10, 2)
result == total
}
def "GetUnitPrice"() {
given: "A test item"
ItemOrdered testItem = getItemOrdered()
when: "Getting Value"
FixedDecimal result = testItem.unitPrice
then: "Should be correct"
result == ITEM_UNIT_PRICE
}
}
Run Code Online (Sandbox Code Playgroud)
这是我单击 IntelliJ 中的双箭头运行完整单元测试时的输出...
Testing started at 12:47 PM ...
Starting Gradle Daemon...
Connected to the target VM, address: '127.0.0.1:33391', transport: 'socket'
Gradle Daemon started in 621 ms
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> No tests found for given includes: [com.heavyweightsoftware.orders.pojo.ItemOrderedTest](filter.includeTestsMatching)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.6.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD FAILED in 4s
4 actionable tasks: 1 executed, 3 up-to-date
Disconnected from the target VM, address: '127.0.0.1:33391', transport: 'socket'
Run Code Online (Sandbox Code Playgroud)
以及测试设置的屏幕截图:
这是我的 build.gradle 文件:
plugins {
id 'org.springframework.boot' version '2.3.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.heavyweightsoftware'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
// for heavyweight software dependencies
flatDir {
dirs 'libs'
}
// Spock snapshots are available from the Sonatype OSS snapshot repository
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
// heavyweight software libraries
compile fileTree(dir: 'libs', include: ['*.jar'])
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
// mandatory dependencies for using Spock
compile "org.codehaus.groovy:groovy-all:3.0.5"
testImplementation platform("org.spockframework:spock-bom:2.0-M1-groovy-2.5")
testImplementation "org.spockframework:spock-core"
testImplementation "org.spockframework:spock-junit4" // you can remove this if your code does not rely on old JUnit 4 rules
// optional dependencies for using Spock
testImplementation "org.hamcrest:hamcrest-core:1.3" // only necessary if Hamcrest matchers are used
testImplementation "net.bytebuddy:byte-buddy:1.9.3" // allows mocking of classes (in addition to interfaces)
testImplementation "org.objenesis:objenesis:2.6" // allows mocking of classes without default constructor (together with CGLIB)
// spring dependencies
implementation (
'org.springframework.boot:spring-boot-configuration-processor',
'org.springframework.boot:spring-boot-starter-data-jpa',
'org.springframework.boot:spring-boot-starter-web',
)
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
Run Code Online (Sandbox Code Playgroud)
我试图找到与此相关的所有问题,但似乎都没有帮助。它似乎没有找到我的单元测试源代码。
免责声明:我是 100% Maven 用户。Gradle 对我来说更像是试错。但我对 Spock 的问题很感兴趣,所以我试了一下。
您需要将 Groovy 插件添加到您的构建文件中:
plugins {
// ...
id 'java'
id 'groovy'
}
Run Code Online (Sandbox Code Playgroud)
这也将有助于 IDEA 认识到这是一个 Groovy 项目,您可以从src/test/groovy.
接下来,您将收到测试编译错误,因为您使用的之间存在明显的不匹配
org.spockframework:spock-bom:2.0-M1-groovy-2.5 对比org.codehaus.groovy:groovy-all:3.0.5,IE
所以要么降级 Groovy,要么升级 Spock。此外,M1 不是最新的,最好使用 M3。
// mandatory dependencies for using Spock
testCompile "org.codehaus.groovy:groovy:2.5.13"
testImplementation platform("org.spockframework:spock-bom:2.0-M3-groovy-2.5")
Run Code Online (Sandbox Code Playgroud)
现在您的测试应该编译并运行。不过,我没有像这样检查测试。如果没有被测类,我无论如何都无法运行它。
摆脱org.spockframework:spock-junit4依赖是可选的。如前所述,Spock 2.x 基于 JUnit 5,因此如果您的项目中没有使用 JUnit 4 功能(例如@RunWithPowerMock 或类似丑陋的东西)的任何遗留 Spock 测试,则不需要它。
也许您想将构建文件更改为更类似于Spock 示例项目中的构建文件。
2021 年 7 月 20 日更新:为了回答另一个问题,我刚刚再次打开了示例项目。在这样做时,我注意到在使用类似的东西时需要小心sourceCompatibility = '11',但在旧的 JDK 上运行构建,例如 8。它会导致以下违反直觉的 Gradle 错误:
Execution failed for task ':test'.
> No tests found for given includes: [com.heavyweightsoftware.orders.pojo.ItemOrderedTest](filter.includeTestsMatching)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Run Code Online (Sandbox Code Playgroud)
只有在使用 Gradle 参数运行测试时--debug,您才会看到根本原因(日志标签和时间戳被删除):
Gradle Test Executor 31 FAILED
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'com.heavyweightsoftware.orders.pojo.ItemOrderedTest'.
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53)
(...)
Caused by:
java.lang.UnsupportedClassVersionError: com/heavyweightsoftware/orders/pojo/ItemOrderedTest has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3905 次 |
| 最近记录: |