2017-09-20 6 views
1

ich einen JUnit-Test schreibe, die eine Methode von einigen autowired Abhängigkeit berufen haben, die mit Cassandra zu interagieren, aber ich bin immer diese Ausnahme:@Autowired und UnsatisfiedDependencyException in einem JUnit-Test

[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)} 

Dies ist jUnit-Test:

import static org.hamcrest.Matchers.hasItems; 
import static org.hamcrest.Matchers.is; 
import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertThat; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.Optional; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

import org.junit.Before; 
import org.junit.ClassRule; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.data.util.Version; 
import org.springframework.test.context.junit4.SpringRunner; 

import example.springdata.cassandra.util.CassandraKeyspace; 
import unicon.matthews.admin.AdminUser; 
import unicon.matthews.admin.service.repository.AdminUserRepository; 

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = CassandraConfiguration.class) 
public class AdminUserRepositoryTests { 

@ClassRule public final static CassandraKeyspace CASSANDRA_KEYSPACE = CassandraKeyspace.onLocalhost().atLeast(Version.parse("3.0")); 

@Autowired AdminUserRepository repository; 

@Before 
public void setUp() throws Exception { 
    repository.deleteAll(); 
} 

@Test 
public void testFindByUsername() { 

    try { 
     final String userName = "aironman"; 
     AdminUser.Builder myBuilderAdmin = AdminUser.Builder.class.newInstance(); 
     myBuilderAdmin.withId("id"); 
     myBuilderAdmin.withEmailAddress("[email protected]"); 
     myBuilderAdmin.withOrgId("orgId"); 
     myBuilderAdmin.withPassword("some-password"); 
     myBuilderAdmin.withSuperAdmin(Boolean.TRUE); 
     myBuilderAdmin.withTenantId("tenantId"); 
     myBuilderAdmin.withUserName(userName); 
     //que viene aqui exactamente? 
     Map<String, String> someMetadata = new HashMap<String, String>(); 
     someMetadata.put("some-key","some-value"); 
     myBuilderAdmin.withMetadata(someMetadata); 
     AdminUser myAdminUser = myBuilderAdmin.build(); 
     repository.save(myAdminUser); 
     Optional<AdminUser> loadedUserName = repository.findByUsername(userName); 
     assertNotNull(loadedUserName); 
     // assertThat(repository.findOne(homer.id).isPresent(), is(true)); 
     assertEquals("something went wrong!",userName,loadedUserName.get().getUsername()); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Done testFindByUsername!"); 
} 

}

AdminUserRepository wie folgt aussieht:

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); 

} 

CassandraConfiguration wie folgt aussieht:

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; 
    } 
} 

}

ich, dass der Frühling verstehen versucht, diese AdminUserRepository Klasse instanziiert die CrudRepository aus federDatenProjekt erstellt wird. Es wird angenommen, dass Spring, wenn ich diese Schnittstelle mit @Repository markiere, die Klasse innerhalb des Spring-Kontextes instanziieren wird, damit eine andere Bean in der Lage ist, sie darin zu autowire, also warum Spring nicht in der Lage ist, die Abhängigkeit zu instanziieren?

Die AdminUserRepository-Schnittstelle befindet sich in src/main/java und AdminUserRepositoryTests befindet sich in src/test/java.

das ist meine tatsächliche pom.xml, bitte helfen.

+0

In welchen Paketen befinden sich die Klassen CassandraConfiguration und AdminUserRepository? Die Konfiguration sollte für alle anderen Klassen "root" sein. –

+0

CassandraConfiguration befindet sich im selben Paket wie AdminUserRepositoryTests, das heißt src/test/java/some-package. Die Abhängigkeit AdminUserRepository befindet sich in src/main/java/another-package. Wenn ich dieses AdminUserRepository testen möchte, muss ich es in src/test/java/some-package kopieren? – aironman

+1

Das könnte ein Problem sein. Stört es dich nicht, CassandraConfiguration auf src/main/java/some.package zu setzen? Und, wie ich bereits sagte, sollte AdminUserRepository in src platziert werden/main/java/some.package.another.one/ –

Antwort

1

Das Markieren eines Spring-Datenrepositorys mit @Repository tut eigentlich nichts. Wenn Sie ein CrudRepository aktivieren möchten, müssen Sie Ihre Konfiguration mit @EnableJpaRepositories versehen. Da Sie jedoch Cassandra verwenden, ist es wahrscheinlicher, dass Sie ein CassandraRepository verwenden möchten.

public interface AdminUserRepository extends CassandraRepository<AdminUser, String> { 

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

} 
+0

Ja, es ist logischer, die CassandraRepository-Schnittstelle anstelle von CrudRepository zu verwenden. Sie sagen, dass ich meine CassandraConfiguration mit @EnableJpaRepositories markieren muss? – aironman

+0

Nein, das war nur, um eine Bean CrudRepository einzurichten. @EnableCassandraRepositories macht es für ein CassandraRepository afaik, obwohl ich Cassandra selbst noch nicht benutzt habe. – Plog

+0

Wenn Sie die CassandraConfiguration-Klasse beobachten, gibt es eine CassandraConfig, die AbstractCassandraConfiguration erweitert, die mit Configuration and EnableCassandraRepositories markiert ist. @Plog – aironman

Verwandte Themen