我似乎没有可以在网上找到使 @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
的方法。事实是,在标记为 JpaRepository
或 CrudRepository
等的接口(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/