2017-09-11 2 views
0

Ich bin neu zu Spring Boot, machte meine erste Entity. Wie kann ich das Repository testen? Ich verwende eine lokale MySQL-Datenbank. Also wäre der erste Schritt die Datenbank zu verspotten?Wie Einheit Einheit in Spring boot

@RunWith(SpringRunner.class) 
    @DataJpaTest 
    public class ClusterTest { 

     @Autowired 
     private TestEntityManager testEntityManager; 

     @Autowired 
     private ClusterRepository clusterRepository; 

     @Test 
     public void testExample() throws Exception{ 
      this.testEntityManager.persist(new Cluster("Project", "System")); 
Cluster cluster = this.clusterRepository.findOne(1); 
      assertThat(testcluster.getProject()).isEqualTo("System"); 
     } 

    } 

Das ist mein Cluster Einheit

@Entity 
@Table(name = "Cluster") 
public class Cluster { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    private String project; 

    public Cluster(){ 

    } 

    public Cluster(String project) { 
     this.project = project; 

    } 

Und mein Repository erstreckt sich nur JpaRepository.

Der Fehler, den ich bekomme, ist java.lang.IllegalStateException: Fehler beim Laden von ApplicationContext. Und ein bisschen nach unten: Fehler beim Ersetzen von DataSource durch eine eingebettete Datenbank für Tests. Wenn Sie eine eingebettete Datenbank wünschen, stellen Sie eine unterstützte auf den Klassenpfad oder stimmen Sie das Ersetzen-Attribut von @AutoconfigureTestDatabase ab.

Dies ist meine Datei application.properties aus src/main/resources/application.properties:

security.basic.enabled=false 
spring.thymeleaf.cache=false 

spring.jpa.hibernate.ddl-auto=update 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.datasource.url=jdbc:mysql://localhost:3306/test 
spring.datasource.username=root 
spring.datasource.password=root 

ich diese Datei zu meiner src/test/resources kopiert/application.properties

Und die Fehler

java.lang.IllegalStateException: Failed to load ApplicationContext 

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:44) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoconfigureTestDatabase. 
+0

Sie erhalten einen Fehler, weil Sie die Spring-Konfigurationsdatei in der Testklasse nicht angegeben haben. –

+0

Möchten Sie das vollständige Beispiel oder nur die Lösung für Ihren Fehler? –

+0

@VivekSingh Wenn möglich das Beispiel. Ich bin sehr neu in all dem. So kann ich wissen, was ich falsch gemacht habe, und daraus lernen – Urban

Antwort

0
@RunWith(SpringRunner.class) 
@DataJpaTest 
@AutoConfigureTestDatabase(replace = NONE) 
public class ClusterTests { 

@Autowired 
    private TestEntityManager entityManager; 

    @Autowired 
    private ClusterRepository clusterRepository; 
} 

die in loszuwerden die in-Memory-Datenbank gene arbeiten soll n. Der beste Weg wäre, eine In-Memory-Datenbank zu verwenden, in der Sie Ihre Entität beibehalten, aber eine andere gute Methode wäre, Ihre Datenbank direkt zu verwenden. Wenn Sie @AutoConfigureTestDatabase (replace = NONE) verwenden, teilen Sie Spring mit, dass die Datenquelle nicht ersetzt werden soll.

Ich hoffe, es hilft

Verwandte Themen