Spring Data - MongoDB - JUnit测试

时间:2015-04-12 08:22:16

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

我有一个关于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:无法自动装配字段:private hello.CustomerRepository hello.test.TestClass.repository;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[hello.CustomerRepository]的限定bean用于依赖:预期至少有1个bean符合此依赖关系的autowire候选者。依赖注释:{@ 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);

}

实际上我不知道为了让测试运行我需要哪些注释 - 也许你会有另外一个建议,以便我可以解决这个问题。

3 个答案:

答案 0 :(得分:3)

对于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')

答案 1 :(得分:1)

您的回购CustomerRepository不需要@Configuration@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 ...
}    

答案 2 :(得分:0)

@SpringApplicationConfiguration内,您需要指向配置类。 <{1}}和UserRepository可能都不是我认为的。

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