我有一个像这样的单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {
@Autowired
UserRepository userRepository;
@Test
public void createTest() throws Exception {
//... blah blah blah
此操作失败,因为我无法使用 @Autowired
加载我的 userRepository
:
Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
我没有像 this would suggest 这样的 applicationContext.xml
.
我的项目结构如下所示:
.
├── main
│ ├── java
│ │ └── com
│ │ └── foo
│ │ └── bar
│ │ ├── Main.java
│ │ ├── models
│ │ │ └── User.java
│ │ └── repositories
│ │ └── UserRepository.java
│ └── resources
│ ├── application.yaml
│ ├── public
│ └── templates
└── test
└── java
└── com
└── foo
└── bar
└── models
└── UserTest.java
该项目大量使用注释。在我的 Main
类中,我有这样的内容:
@SpringBootApplication
@PropertySources({
@PropertySource("classpath:application.yaml"),
})
@EnableJpaRepositories(basePackageClasses = {
UserRepository.class,
})
public class Main {
public static void main(final String[] args) throws Exception {
SpringApplication.run(App.class, args);
}
}
我正在使用 Gradle,并且我有这些测试依赖项:
testImplementation 'junit:junit:4.13'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.hamcrest:java-hamcrest:2.0.0.0'
问题:
有人可以向我解释一下发生了什么事吗?可能的原因和解决方案是什么?
最佳答案
您必须指出将提供接口(interface)实现的组件。根据您的情况,您可以执行以下操作:
@RunWith(SpringRunner.class)
@SpringBootTest(classes={Main.class})
public class UserTest {
....}
或者
在测试源中创建配置类,如下所示
@Configuration
@EnableJpaRepositories(basePackageClasses = {
UserRepository.class,
})
public class PersistenceConfiguration {
}
很可能您也必须创建一个如下所示的配置类:
@Configuration
@@EntityScan(basePackage={"packages.where.you.put.your.entity.classes"})
public class EntityConfiguration {}
之后,在测试中使用该类,如下所示:
@RunWith(SpringRunner.class)
@SpringBootTest(classes={PersistenceConfiguration.class, EntityConfiguraiton.class})
public class UserTest {
....}
关于java - 我应该如何在没有 xml 的情况下加载 Spring 的 ApplicationContext 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814529/