Spring Data - MongoDB - JUnit测试

3

我有一个关于Spring Data - MongoDB和JUnit测试的问题。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { UserRepository.class, User.class })
public class MyJUnitTest {

用户存储库(UserRepository)如下所示:

@Repository
public interface UserRepository extends MongoRepository<User, String> {
    User findByUsername(final String username);
}

我遇到了如下异常:

无法实例化[... .repository.UserRepository]:指定的类是一个接口

我的问题是,即使没有实现类,如何实例化UserRepository,因为Spring Data会自己完成实现?如果我不在UserRepository上标记@Repository,则Spring不会创建bean对象。

[编辑]

我已经尝试了您发布的链接示例,并且在使用main方法运行应用程序时运行良好。 然后我尝试实现一个测试类,但在这种情况下,我得到了相同的异常:

使用名称'hello.test.TestClass'创建bean出错:自动装配依赖项失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private hello.CustomerRepository hello.test.TestClass.repository; 嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到合格的类型为[hello.CustomerRepository]的bean以满足此依赖项:至少需要1个符合条件的bean作为此依赖项的自动注入候选。依赖项注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}}

我的测试类位于src/test/java/hello/test中(hello.test是包名):

@ComponentScan("hello")
@EnableMongoRepositories(basePackages = "hello")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { CustomerRepository.class,     Customer.class })
public class TestClass {

@Autowired
private CustomerRepository repository;

@Test
public void testMethod() {
    System.out.println("repositoryd: " + repository);
    }
}

我的CustomerRepository看起来像这样(带@Configuration注解):

@Configuration
public interface CustomerRepository extends MongoRepository<Customer, String> {

public Customer findByFirstName(String firstName);

public List<Customer> findByLastName(String lastName);

}

实际上我不知道需要哪些注解才能让测试运行 - 或许你有其他建议,以便我可以解决这个问题。


UserRepository接口中删除@Repository注释。Spring Data使用不同的机制来发现Spring Data Repository类型。 - Julius Krah
博客文章的链接已失效... - Olivier Gérardin
4个回答

3
对于Spring Boot 1.5.8.RELEASE,您可以使用@SpringBootTest来引导所有Spring配置。
您的测试将如下所示。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeRepositoryTests {

    @Autowired
    private SomeRepository someRepository;

    @Test
    public void someTest() {
        someRepository.someMethod(...);
        // assertions
    }
}

当然,您希望在测试中使用内嵌的mongodb,因此请添加以下内容:for Maven
<dependency>
  <groupId>de.flapdoodle.embed</groupId>
  <artifactId>de.flapdoodle.embed.mongo</artifactId>
  <scope>test</scope>
</dependency>

对于Gradle

testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo')

真的这么简单吗???但是对于服务和其他字段的@Autowired怎么办?@SpringBootTest能够自动装配它们吗?(我在Spring中使用mockito进行测试...) - Stefano Scarpanti
其他领域是什么? - A0__oN
我在思考几个服务和仓库。 - Stefano Scarpanti
仓库不应该依赖于服务,对于其他仓库,你只需要像添加SomeRepository一样,如果Spring能找到它,它就会加载它。 - A0__oN

1
你的代码库 CustomerRepository 不需要 @Configuration@Repository 注解。当你继承基本 Repository 类时,Spring 将自动完成这些操作。
要设置 Mongo 代码库,你需要使用以下注解扩展 ApplicationContext
@Configuration
@EnableAutoConfiguration // create MongoTemplate and MongoOperations
@EnableMongoRepositories(basePackages = "hello.test") // Create your repos
public class ApplicationConfig {

}

你也希望在单元/集成测试中使用内存数据库,以避免修改生产数据库。
只需添加以下依赖项即可启用:
<dependency>
  <groupId>de.flapdoodle.embed</groupId>
  <artifactId>de.flapdoodle.embed.mongo</artifactId>
  <version>1.50.2</version>
  <scope>runtime</scope>
</dependency>

最后,使用 ApplicationContext 配置您的测试类。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationConfig.class)
public class MyJUnitTest {
    // Test cases ...
}    

0
如果你正在使用JUnit 5,并且想以最轻量级的方式启动Spring,那么你需要在你的IntegrationTest类上添加以下注解。
@DataMongoTest
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {MyMongoService.class})
@EnableMongoRepositories(basePackageClasses = MyRepository.class)
public class MyMongoIntegrationTest {
    
    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private MyRepository myRepository;

    @Autowired
    private MyMongoService myMongoService; <-- Assuming this injects MyRepository
    
}

0

@SpringApplicationConfiguration 中,您需要指向一个配置类。我想,UserRepositoryUser 都不是配置类。

要开始使用 Spring 和 Spring Data MongoDB 基础知识,请务必查看 这个入门指南


1
你好,Oliver。我已经尝试了链接中的示例,它可以正常工作 - 但是我不知道如何运行我的测试(我已经编辑了我的帖子)。如果你能再次帮助我,那就太棒了 - 非常感谢! - quma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接