我有一个关于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);
}
实际上我不知道为了让测试运行我需要哪些注释 - 也许你会有另外一个建议,以便我可以解决这个问题。
答案 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。