2017-01-19 130 views
1

これは、ユーザーがRESTful Webサービスを介してdbから国情報を取得できるようにするテスト(Gradle)Springブートプロジェクトです。 私はアプリケーション(gradlew bootRun)を実行することができ、期待どおりに動作します。しかし、私のJUnitテストはServiceControllerUnitTestを実行して例外をスローします。私はSpringに慣れていないので、私はおそらく私のテスト設定に関連した、かなり明白なものを見逃していると思います。ControllerでJUnitテストを実行するとUnsatisfiedDependencyExceptionが発生する

enter image description here

build.gradle

dependencies { 

     // Spring Boot 
     compile("org.springframework.boot:spring-boot-starter-web") 
     compile('org.springframework.boot:spring-boot-starter-web-services') 
     compile('org.springframework.boot:spring-boot-starter-data-rest') 
     compile("org.springframework.boot:spring-boot-devtools") 

     compile 'org.springframework.boot:spring-boot-starter-data-jpa:1.1.4.RELEASE' 
     compile 'org.hibernate:hibernate-core:4.3.6.Final' 
     compile 'org.hibernate:hibernate-entitymanager:4.3.6.Final' 
     compile 'javax.servlet:javax.servlet-api:3.1.0' 
     compile 'org.slf4j:slf4j-simple:1.7.7' 
     compile 'org.javassist:javassist:3.15.0-GA' 
     compile 'mysql:mysql-connector-java:5.1.31' 
     compile 'commons-dbcp:commons-dbcp:1.4' 

     // Unit Testing 
     testCompile('org.springframework.boot:spring-boot-starter-test') 
     testCompile("junit:junit:4.12") 
     testCompile("org.mockito:mockito-core:1.10.19") 
     testCompile("com.jayway.jsonpath:json-path-assert:0.8.1") 

    } 

エラー

[main] ERROR org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.boot.test.a[email protected]4e1d422d] to prepare test instance [[email protected]] 
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.pckg.controller.ServiceControllerUnitTest': Unsatisfied dependency expressed through field 'controller'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.pckg.controller.ServiceController' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 

ServiceController.java

@RestController 
    public class ServiceController { 

     @Autowired 
     ICountryService countryService; 

     @RequestMapping("/country") 
     public Country getCountryByName(@RequestParam(value = "name", required = true) String countryName) { 

      Country country = countryService.getCountryByName(countryName); 
      return country; 
     } 

     @RequestMapping("/continent") 
     public List<Country> getCountryByContinent(@RequestParam(value = "name", required = true) String continent) { 

      List<Country> countries = countryService.getCountriesByContinent(continent); 
      return countries; 
     } 

     @RequestMapping("/countries") 
     public List<Country> getAllCountries() { 
      List<Country> countries = countryService.getAllCountries(); 
      return countries; 

     } 
    } 

ServiceControllerUnitTest.java

@Category(UnitTest.class) 
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(classes = AppConfig.class) 
    public class ServiceControllerUnitTest extends UnitTest { 

     private MockMvc mockMvc; 

     @Autowired 
     private ServiceController controller; 

     @Override 
     @Before 
     public void setUp() { 
      super.setUp(); 
      mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
     } 

UnitTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
    @SpringBootTest(classes = UnitTestConfig.class) 
    @WebAppConfiguration 
    public abstract class UnitTest { 
     @Before 
     public void setUp() { 
      MockitoAnnotations.initMocks(this); 
     } 
    } 

UnitTestConfig.java

public class UnitTestConfig extends MockServletConfig { 

    } 

答えて

4

私はそれを理解して、間違ったファイルを参照していたServiceControllerUnitTest.javaの@ContextConfigurationであることが判明しました。アプリケーションで2つのファイルを使用しましたApp.javaAppConfig.java(上のスクリーンショット)

私のApp.javaにはmainメソッドしか含まれていませんでした。

App.java

@SpringBootApplication 
    public class App extends SpringBootServletInitializer { 

     public static void main(String[] args) { 
      SpringApplication.run(App.class, args); 
     } 

そして、私のAppConfig.java私@Bean宣言を含んでいました。

AppConfig.java

例えば

@Bean 
    public HibernateTemplate getHibernateTemplate() { 
     return new HibernateTemplate(getSessionFactory()); 
    } 

私は実際に代わりApp.javaファイルの@ContextConfiguration注釈でAppConfig.javaファイルを参照します。

ServiceControllerUnitTest.java

@Category(UnitTest.class) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = AppConfig.class) // >>>> issue here 
public class ServiceControllerUnitTest extends UnitTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private ServiceController controller; 

    @Override 
    @Before 
    public void setUp() { 
     super.setUp(); 
     mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

私はcom.pckgパッケージの下に一つのファイルAppConfig.javaに両方のファイルApp.javaとAppConfig.javaからのコードを組み合わせています。

すべてがうまく動作しています。

関連する問題