我正在编写一个基于Java Spring的库。我为他们写了junit测试。我遇到的问题是,虽然我的豆子正在打印,但它们没有正确地自动装配。它们是空的。
这是代码。
@Test
public void test() {
System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
try{
DBClient dbClient = new DBClient();
dbClient.doSomething();
}catch(Exception e){
e.printStackTrace();
}
}
这是我的DBClient代码:
@Autowired
@Qualifier("UserActivityRepositoryService")
private UserActivityRepositoryService userRepositoryService;
public void doSomething() {
System.out.println("Inside db client. Getting the count");
System.out.println(this.userRepositoryService.count());
}
这是我的UserRepositoryService类代码
@Service
@Qualifier("UserActivityRepositoryService")
public class UserActivityRepositoryService implements IRepoClient<UserActivity>{
private UserActivityRepository repo;
@Autowired
public void setUserActivityRepository(UserActivityRepository repo) {
this.repo = repo;
}
public void create(UserActivity userActivity) {
repo.save(userActivity);
}
@Override
public UserActivity save(UserActivity entity) {
// TODO Auto-generated method stub
System.out.println("Creating the documenht");
try{
repo.save(entity);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("userActivity" + entity);
return null;
}
@Override
public Iterable<UserActivity> save(Iterable<UserActivity> entities) {
// TODO Auto-generated method stub
return null;
}
@Override
public UserActivity findOne(String id) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean exists(String id) {
// TODO Auto-generated method stub
return false;
}
@Override
public Iterable<UserActivity> findAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public Iterable<UserActivity> findAll(Iterable<String> ids) {
// TODO Auto-generated method stub
return null;
}
@Override
public void delete(String id) {
// TODO Auto-generated method stub
}
@Override
public void delete(UserActivity entity) {
// TODO Auto-generated method stub
}
@Override
public void delete(Iterable<? extends UserActivity> entities) {
// TODO Auto-generated method stub
}
@Override
public void deleteAll() {
// TODO Auto-generated method stub
}
@Override
public long count() {
// TODO Auto-generated method stub
return 0;
}
}
这是我的输出: [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor ,org.springframework.context.event.internalEventListenerFactory,myCouchbaseConfig,integrationTestConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,CBRepoFactory,repoFactoryBuilder,config,userActivityRepositoryService,couchbaseBucket,couchbaseCluster ,couchbaseClusterInfo,couchbaseEnv,couchbaseTranslationService,couchbaseIndexManager,couchbaseMappingConverter,couchbaseTemplate,couchbaseRepositoryOperationsMapping,couchbaseMappingContext,couchbaseCustomCo nversions,org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension#0,userActivityRepository] 显示java.lang.NullPointerException 在db客户端内部。获得点数
谁能告诉我我做错了什么。
答案 0 :(得分:3)
Classic Spring新手的错误。我已经看过一千次了。
你自动安装了一个类DBClient
,期望Spring会为你处理所有的依赖注入。
然后通过调用new
来实例化您自己的实例:
DBClient dbClient = new DBClient();
致电new
后,它已经超出了Spring的控制范围。这里没有自动接线,UserActivityRepositoryService
为空。
你必须选择:让Spring控制一切,或者你做。
如果您正在测试,我建议您使用模拟并将Spring从JUnit测试中删除。
我还建议您更喜欢构造函数注入getter / setter。这样你就可以在需要的时候在代码中完成它,就像你在编写单元测试一样。
您似乎正在尝试编写数据服务。我建议你忘记你的框架并使用Spring Boot。它已经does this了。
答案 1 :(得分:0)
你需要改变你的测试(就像duffymo已经说过的那样):
@Autowired
private DBClient dbClient;
@Test
public void test() {
System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
try{
dbClient.doSomething();
}catch(Exception e){
e.printStackTrace();
}
}