我似乎没有可以在网上找到使 @DataJpaTest 正确运行的特定标准方法。

现在是否不使用 @DataJpaTest 并且所有测试都使用 @SpringBootTest 在服务或 Controller 级别运行?

    @Repository
    public interface MyBeanRepository extends JpaRepository<MyBean, Long> {
    }

    @Configuration
    @EnableJpaRepositories("com.app.repository.*")
    @ComponentScan(basePackages = { "com.app.repository.*" })
    public class ConfigurationRepository {
    }


    @Entity
    public class MyBean {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id")
        private Long id;

        @Version
        @Column(name = "version")
        private Integer version;

        @NotNull
        @Size(min = 2)
        private String name;
    }

    @DataJpaTest
    public class MyBeanIntegrationTest {

        @Autowired
        MyBeanRepository myBeanRepository;

        @Test
        public void testMarkerMethod() {
        }

        @Test
        public void testCount() {
            Assertions.assertNotNull(myBeanRepository , "Data on demand for 'MyBean' failed to initialize correctly");
        }
    }

使用 Eclipse->Run Junit 运行会显示这些日志。
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
    at org.springframework.util.Assert.state(Assert.java:73)

使用 gradle test 运行显示 init 失败的错误。
FAILURE: Build failed with an exception.

* What went wrong:
Test failed.
    Failed tests:
        Test com.app.repository.MyBeanIntegrationTest#initializationError (Task: :test)

这是gradle脚本。
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin")
    }
}

plugins {
    id 'org.springframework.boot' version '2.1.5.RELEASE'
    id 'java'
    id 'eclipse'

}

apply plugin: 'io.spring.dependency-management'

group = 'com.app'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenLocal()
    jcenter()
    mavenCentral()
}

test {
    useJUnitPlatform()
}

dependencies {
    // This dependency is exported to consumers, that is to say found on their compile classpath

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    runtimeOnly 'org.hsqldb:hsqldb'
    testImplementation ('org.springframework.boot:spring-boot-starter-test') {
        // exlcuding junit 4
        exclude group: 'junit', module: 'junit'
    }

    /**
        Test Dependencies Follows
    **/


    // junit 5 api
    testCompile "org.junit.jupiter:junit-jupiter-api:5.2.0"
    // For junit5 parameterised test support
    testCompile "org.junit.jupiter:junit-jupiter-params:5.2.0"
    // junit 5 implementation
    testRuntime "org.junit.jupiter:junit-jupiter-engine:5.2.0"
    // Only required to run junit5 test from IDE
    testRuntime "org.junit.platform:junit-platform-launcher"

}

编辑:

这已在同一个存储库中解决并提交。
https://github.com/john77eipe/spring-demo-1-test

最佳答案

添加 Github 链接是个好主意。我可以在那里看到以下问题:

1) 如果您不能使用 @SpringBootApplication 注释主类,则可以使用:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.app.repository")
public class MySampleApplication {
}

2) 将 ConfigurationRepository 类上的注释更改为:

@EnableJpaRepositories("com.app.repository")
@ComponentScan(basePackages = { "com.app.repository" })
public class ConfigurationRepository {

那应该让我们继续下一点:

3) 您的 MyBeanIntegrationTest 应注释为:

@SpringBootTest(classes = MyAppApplication.class)
public class MyBeanIntegrationTest {

4) 在 application.yml 中,最后一行的缩进有一个小问题。将制表符转换为空格,应该没问题。

5) 接下来是 MyBeanRepository 接口(interface)。您不能在那里使用名为 findOne 的方法。事实是,在标记为 JpaRepositoryCrudRepository 等的接口(interface)中,方法名称需要遵循一定的规则。如果您将其标记为包含MyBean类型的存储库,则您的方法名称应更改为findById,因为Spring将在您的bean中查找名为id的属性。通过 findOne 命名将导致测试失败:
No property findOne found for type MyBean!

解决这些问题后,您的测试通过了我的 env。

我希望这有帮助!

关于spring-boot - 带有 JUnit 5 的 Spring @DataJpaTest,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56214710/

10-11 17:58