2016-08-12 5 views
0

Mein Projekt verwendet spring-boot (1.4.0.release) und mybatis-spring-boot-starter. Wenn ich versuche, einige Test-Code für den Controller zu haben, habe ich immer eine Ausnahme@WebMvcTest mapperscan Konflikt

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 
at org.springframework.util.Assert.notNull(Assert.java:115) 
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:75) 
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:74) 
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
... 42 more` 

Aber wenn ich @MapperScan("com.toby.mapper") kommentieren, es läuft sehr gut. Hier ist meine Beispielklasse:

@MapperScan("com.toby.mapper") 
 
@EnableTransactionManagement 
 
@EnableConfigurationProperties(AppConfig.class) 
 
@SpringBootApplication(scanBasePackages = "com.toby.configuration,com.toby.web.controller,com.toby.service,com.toby.dao") 
 
public class Example { 
 

 
    public static void main(String[] args) throws Exception { 
 
     //new SpringApplicationBuilder().sources(Example.class).run(args); 
 
     SpringApplication application=new SpringApplication(Example.class); 
 
     application.addInitializers(new PropertyPasswordDecodingContextInitializer()); 
 
     application.run(args); 
 
    } 
 

 
}

Hier mein Testcode ist:

package com.toby.web.controller; 
 

 
import com.toby.common.config.AppConfig; 
 
import org.junit.Test; 
 
import org.junit.runner.RunWith; 
 
import org.springframework.beans.factory.annotation.Autowired; 
 
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 
 
import org.springframework.boot.test.mock.mockito.MockBean; 
 
import org.springframework.test.context.junit4.SpringRunner; 
 
import org.springframework.test.web.servlet.MockMvc; 
 

 
/** 
 
* Created by Toby on 2016/8/10. 
 
*/ 
 
@RunWith(SpringRunner.class) 
 
@WebMvcTest(value = MyRestController.class) 
 
public class MyRestControllerTests { 
 
    @Autowired 
 
    private MockMvc mvc; 
 

 
    @MockBean 
 
    private AppConfig appConfig; 
 

 
    @Test 
 
    public void testHome() throws Exception { 
 
     /*this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN)) 
 
       .andExpect(status().isOk()).andExpect(content().string("Honda Civic"));*/ 
 
    } 
 
}

+0

Was sind die Abhängigkeiten von 'MyRestController'? Spring Boot wird diese Klasse nur als eine Bean registrieren, also muss alles, auf das Sie im Controller angewiesen sind, entweder bereitgestellt oder verspottet werden. –

+0

MyRestController nur eine sehr einfache Demo; nur abhängig von @Autowired private AppConfig appConfig; und haben auch einen anderen Controller von Datenbank bezogenen Ressourcen abhängen –

+0

Das Problem ist, dass ich @WebMvcTest (value = MyRestController.class) im Testcode angeben. Warum wurde ein anderer Controller ausgeführt? –

Antwort

1

Ich denke, man die Beschreibung aktualisiert haben oder I didn Lies es beim ersten Mal nicht richtig. @MapperScan ist eine mybatis-spezifische Annotation, die etwas auslöst, aber einige Wächter irgendwie vermisst.

Wir hatten das gleiche Problem im Boot tatsächlich. Nehmen wir an, Sie setzen @EnableCaching auf Ihre Haupt-App. Da das Slicing alle Autokonfigurationen deaktiviert, würde die automatische Cache-Konfiguration nicht aktiviert und Sie erhalten eine Ausnahme, weil CacheManager nicht gefunden wird. Um dieses Problem zu beheben, haben wir begonnen, einige Anmerkungen zu erstellen, um diese einfach zu aktivieren. Wenn Sie sich WebMbcTest ansehen, sehen Sie, dass es mit AutoConfigureCache versehen ist, das einen Dummy-No-Op-Cache-Manager bereitstellen wird, sofern nicht anders angegeben.

Ihr Problem ist, dass der mybatis-Support eine Integration von Drittanbietern ist und es keine Unterstützung dafür gibt. Einige Lösungen:

  • ändern @WebMbvcTest die Klasse einer anderen Konfigurationsklasse zur Verfügung zu stellen, effectivly die Verwendung Ihres Hauptfeder-Boot-App deaktivieren. Natürlich sollte diese Klasse die @MapperScan Anmerkung nicht definieren
  • Verschieben Sie die MapperScan (und alles, was nicht mit Slicing erforderlich ist) in eine andere Configuration Klasse. Es könnte sich um eine Klasse im selben Paket wie Ihre App handeln. Slicing scannt diese standardmäßig nicht, damit es dir gut geht. Es ist bei weitem die einfachste
  • Erstellen Sie ein Problem in der mybatis-Unterstützung, so dass sie die automatische Konfiguration zu Back-off verbessern (diese Ausnahme zu verhindern). Ich bin nicht sicher, ob das möglich ist tatsächlich

Lange Rede kurzer Sinn, da @MapperScan ein Weg ist Mybatis zu sagen, Ihre Entitäten zu scannen, vielleicht sollten Sie es auf Ihrem Haupt-Boot-App nicht hinzufügen, wenn Sie schneiden verwenden. Weil deine @WebMbcTest das offensichtlich nicht benutzen will.