2015-04-12 112 views
2

我想问一个关于Spring Data的问题 - MongoDB和JUnit测试。Spring数据 - 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]:指定类是一个接口

我现在的问题是,如何做到这一点,UserRepositor y是实例化的,虽然没有实现类,因为Spring Data是通过自己的实现来实现的?如果我不@Repository比Spring标记USerRepository不创建bean对象

[编辑]

我已经试过你贴的链接的例子,如果我跑过来的主要应用,它工作正常- 方法。 然后我试图执行一个测试类,但是在这种情况下,我得到了同样的异常:

错误创建名为“hello.test.TestClass”豆:自动装配依赖注入失败;嵌套异常是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(必需=真)}

我的测试类看起来像这样的src /测试/ JAVA /你好/测试(是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); 

} 

其实我也不知道我需要为了得到测试运行的注解 - 也许你将有另一个建议,以顺序在我可以解决这个问题。 非常感谢您的帮助!

[编辑 - 已解决]

所以,如果有人需要回答这个问题 - 我有张贴一个完整的答案和工作applikation这个问题Full working Spring Boot, Spring Data, MongoDB Application for download

非常感谢

+0

从UserRepository接口中删除'@ Repository'注释。弹簧数据使用不同的机制来发现Spring Data Repository类型 –

回答

0

@SpringApplicationConfiguration你需要指向一个配置类。 UserRepositoryUser都不是我所假设的。

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

+1

你好奥利弗,我已经尝试过链接的例子,它工作正常 - 但我不知道如何运行我的测试(我已经编辑了我的帖子)。如果你能够帮助我,那将是非常棒的 - 非常感谢! – quma

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 ... 
}  
1

春天引导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') 
+0

真的很简单吗?但是关于服务和其他领域的“@ Autowired”呢? '@ SpringBootTest'能够自动装载它们吗? (我在春季使用mockito进行测试...) –

+0

还有其他什么字段? –

+0

我在想几个服务和存储库。 –