我有一个关于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