Spring @DataJpaTest with JUnit 5

拈花ヽ惹草 提交于 2021-01-27 05:29:32

问题


There doesn't seem to be a specific standard way I can find online that makes @DataJpaTest to run correctly.

Is it true that @DataJpaTest is not being used nowadays and all tests are run at the service or controller level using @SpringBootTest?

    @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");
        }
    }

Running using the Eclipse->Run Junit shows these logs.

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)

Running using gradle test shows the error that init failed.

FAILURE: Build failed with an exception.

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

Here is the gradle script.

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"

}

EDIT:

This has been solved and committed at the same repository. https://github.com/john77eipe/spring-demo-1-test


回答1:


It was a good idea to add a Github link. I can see following issues there:

1) If you can't have a main class annotated with @SpringBootApplication, you can use:

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

2) Change annotations over your ConfigurationRepository class to:

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

That should let us proceed to the next point:

3) Your MyBeanIntegrationTest should be annotated as:

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

4) In application.yml you have a small issue with indentation in the last line. Convert tab so spaces and it should be fine.

5) Next thing is MyBeanRepository interface. You can't use a method named findOne there. Thing is, that in interfaces marked as JpaRepository or CrudRepository and so on, methods names need to follow certain rules. If you mark that it will be a repository containing type MyBean your method name should be changed to findById, because Spring will look for a property named id in your bean. Naming it by findOne will cause test to fail with:

No property findOne found for type MyBean!

After fixing these things, your tests pass on my env.

I hope this helps!



来源:https://stackoverflow.com/questions/56214710/spring-datajpatest-with-junit-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!