我正在尝试编写一个虚拟集成测试,以便对我第一次使用的这些技术进行一些练习,但是,我目前在自动连接的存储库字段(称为 movieRepository)上遇到了NullPointerException。
我从其他问题中了解到主要原因是没有正确设置注解。但是,我认为情况并非如此,因为MovieRepository没有@Repository注解,因为据我所知,MongoRepository不需要它(但即使添加它也不会改变任何事情),而是MovieRepositoryIntegrationTest从它扩展的抽象类中继承了注解。
MovieRepository.java
package com.example.testingtwo.repository; // /main/
public interface MovieRepository extends MongoRepository<Movie, String> {
}
AbstractContainerBaseTest.java
package com.example.testingtwo; // /test/
@DataMongoTest
public abstract class AbstractContainerBaseTest {
static final MongoDBContainer mongoDBContainer;
static {
mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:6.0.2"));
mongoDBContainer.start();
}
@DynamicPropertySource
static void setProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
}
}
MovieRepositoryIntegrationTest.java
package com.example.testingtwo.repository; // /test/
public class MovieRepositoryIntegrationTest extends AbstractContainerBaseTest {
@Autowired
private MovieRepository movieRepository;
@AfterEach
void cleanUp() {
movieRepository.deleteAll();
}
@Test
public void testFindById() {
Movie movie = new Movie(null, "Test Name", "Test Description");
String movieId = movieRepository.save(movie).getId(); // java.lang.NullPointerException: "this.movieRepository" is null
Movie movieFound = movieRepository.findById(movieId).orElse(null);
assertNotNull(movieFound);
assertEquals(movieFound.getName(), movie.getName());
assertEquals(movieFound.getDescription(), movie.getDescription());
}
}
其他信息:
- Java 17语言
- Spring Boot 3.0 RC 1
- 六月五日
- 构建工具:Maven
- Spring相关性:Spring Web、Spring Data MongoDB、Lombok岛、测试容器
1条答案
按热度按时间wvmv3b1j1#
依赖项为空的事实告诉我,单元测试可能没有在Spring上下文中运行,因此就好像您没有
@Autowired
注解一样。您在使用junit4吗?根据@DataMongoTest
的javadoc“当使用JUnit 4时,此注解应该与@RunWith(SpringRunner.class)
结合使用。”