【问题标题】:Spring Data - MongoDB - JUnit testSpring Data - MongoDB - JUnit 测试
【发布时间】:2015-06-17 16:58:21
【问题描述】:

我有一个关于 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 自己执行实现?如果我不使用 @Repository 标记 USerRepository ,则 Spring 不会创建 bean 对象

[编辑]

我已经尝试过您发布的链接示例,如果我通过 main- 方法运行应用程序,它可以正常工作。 然后我尝试实现一个测试类,但在这种情况下我得到了同样的异常:

创建名为“hello.test.TestClass”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 hello.CustomerRepository hello.test.TestClass.repository;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type of [hello.CustomerRepository] ​​found for dependency: 预计至少有 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 类型
  • 博客条目的链接已失效...

标签: spring junit spring-data spring-data-mongodb


【解决方案1】:

对于 Spring Boot 1.5.8.RELEASE

您可以使用@SpringBootTest 引导您所有的弹簧配置。

你的测试看起来像

@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>

for Gradle

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

【讨论】:

  • 真的这么简单???但是服务等领域的@Autowired呢? @SpringBootTest 可以自动接线吗? (我在 Spring 中使用 mockito 进行测试...)
  • 还有哪些字段?
  • 我在考虑几个服务和存储库。
  • 存储库不应依赖于服务,对于其他存储库,您可以像 SomeRepository 一样添加,如果 spring 可以找到它,它将加载它。
【解决方案2】:

您的 repo 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 ...
}    

【讨论】:

    【解决方案3】:

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

    要开始使用 Spring 和 Spring Data MongoDB 基础知识,请务必查看 this getting started guide

    【讨论】:

    • 你好奥利弗,我已经尝试了链接的例子,它工作正常 - 但我不知道如何运行我的测试(我已经编辑了我上面的帖子)。如果您能再次帮助我,那就太好了 - 非常感谢!
    猜你喜欢
    • 2019-10-26
    • 2015-12-17
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多