我正在写一个基于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.internalEventListenerFactory,myCouchbaseConfig,integrationTestConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,CBRepoFactory,repoFactoryBuilder,positorBucket,BuildUserBase, ,couchbaseClusterInfo,couchbaseEnv,榻榻米基础翻译服务,榻榻米基础索引管理器,榻榻米基础映射转换器,榻榻米基础模板,榻榻米基础存储操作映射,榻榻米基础映射上下文,榻榻米基础定制公司nversions,org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension#0,userActivityRepository]
java.lang.NullPointerException
内部数据库客户端。得到计数

谁能告诉我我在做什么错。

最佳答案

经典春季新手错误。我看过一千遍了。

您自动连接了一个类DBClient,期望Spring将为您处理所有依赖项注入。

然后,通过调用new实例化自己的实例:

DBClient dbClient = new DBClient();


一旦调用new,它将不受Spring的控制。这里没有自动接线,UserActivityRepositoryService为空。

您必须选择:要么让Spring控制所有事情,要么您做。

如果您正在测试,我建议您使用模拟,并将Spring排除在JUnit测试之外。

我还建议您更喜欢使用构造方法注入而不是使用getter / setter方法。这样一来,您就可以在需要的时候(例如在编写单元测试时)在代码中进行操作。

看起来您正在尝试编写数据服务。我建议您不要使用框架,而使用Spring Boot。它已经为您does this

09-25 18:38
查看更多