Spring boot @junit测试中的自动连线和未满足的PendencyException

Spring boot @junit测试中的自动连线和未满足的PendencyException,spring-boot,spring-data-cassandra,Spring Boot,Spring Data Cassandra,我正在编写一个junit测试,它必须从一些必须与Cassandra交互的自动连线依赖项中调用某些方法,但我遇到了以下异常: [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.21 s <<< FAILURE! - in unicon.mattheews.admin.service.repository.test.AdminUserRepositoryTests [ERROR] te

我正在编写一个junit测试,它必须从一些必须与Cassandra交互的自动连线依赖项中调用某些方法,但我遇到了以下异常:

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.21 s <<< FAILURE! - in unicon.mattheews.admin.service.repository.test.AdminUserRepositoryTests
[ERROR] testFindByUsername(unicon.mattheews.admin.service.repository.test.AdminUserRepositoryTests)  Time elapsed: 0.001 s  <<< ERROR!
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'unicon.mattheews.admin.service.repository.test.AdminUserRepositoryTests': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'unicon.matthews.admin.service.repository.AdminUserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'unicon.matthews.admin.service.repository.AdminUserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
}

我知道spring正在尝试实例化这个AdminUserRepository类,它是使用spring数据项目中的Crudepository创建的。假设如果我用@Repository标记这个接口,spring将在spring上下文中实例化该类,以便另一个bean能够在其中自动连接它,那么,为什么spring不能实例化依赖项呢

AdminUserRepository接口位于src/main/java中,AdminUserRepositoryTests位于src/test/java中


这是我的真实想法,请帮助。

用@repository标记Spring数据存储库实际上没有任何作用。如果不想启用CrudePositories,则需要使用@EnableJpaRepositories对配置进行注释。然而,既然你用的是卡桑德拉,我想你更可能想用卡桑德拉存储库

public interface AdminUserRepository extends CassandraRepository<AdminUser, String> {

@Query("select * from AdminUser where username = ?0")
Optional<AdminUser> findByUsername(final String userName);

}
公共接口AdminUserRepository扩展了CassandraRepository{ @查询(“从AdminUser中选择*,其中用户名=?0”) 可选findByUsername(最终字符串用户名); }
CassandraConfiguration和AdminUserRepository类位于哪些包中?配置应该是所有其他类的“根”。CassandraConfiguration与AdminUserRepositoryTests位于同一个包中,后者是src/test/java/some包。依赖项AdminUserRepository位于src/main/java/other包中。如果我想测试这个AdminUserRepository,我必须将它复制到src/test/java/some包中吗?这可能是个问题。您不介意将CassandraConfiguration设置为src/main/java/some.package吗?而且,正如我之前所说的,AdminUserRepository应该放在src/main/java/some.package.other.one/就是这样!现在我得到了另一个异常:org.springframework.cassandra.support.exception.CassandraInvalidQueryException:unconfigured table adminuser;嵌套异常是com.datastax.driver.core.exceptions.InvalidQueryException:未配置的表adminuser,但这是另一个问题。。。我想我必须首先在所选的键空间中创建表adminuser。是的,使用CassandraRepository接口而不是Crudepository更符合逻辑。你是说我必须用@EnableJpaRepositories标记我的Cassandra配置?不,那只是为了建立一个Crudepository bean@EnableCassandraRepositories会为CassandraRepositories做这件事,尽管我以前没有使用过Cassandra。如果你看CassandraConfiguration类,有一个CassandraConfiguration扩展了用Configuration和EnableCassandraRepositories标记的AbstractCassandraConfiguration@老实说,普洛吉会提出一个新问题。Spring自动布线问题现在至少得到了解决。
@Query
不需要使用Spring数据Cassandra 1.5。对于1.4和更早版本,它是必需的。您不需要扩展
CassandraRepository
crudepository
就足够了。
import java.util.Optional;
import org.springframework.data.cassandra.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import unicon.matthews.admin.AdminUser;


@Repository
public interface AdminUserRepository extends CrudRepository<AdminUser, String> {

@Query("select * from AdminUser where username = ?0")
Optional<AdminUser> findByUsername(final String userName);

}
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.config.java.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;

@Configuration
@EnableAutoConfiguration
class CassandraConfiguration {

@Configuration
@EnableCassandraRepositories
static class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    public String getKeyspaceName() {
        return "example";
    }

    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.RECREATE;
    }
}
public interface AdminUserRepository extends CassandraRepository<AdminUser, String> {

@Query("select * from AdminUser where username = ?0")
Optional<AdminUser> findByUsername(final String userName);

}