2013-04-21 12 views
12

Spring 3.2.1を使用してspring-mvcテストを作成しようとしています。いくつかのチュートリアルに続いて、私はこれが簡単だと思いました。ここで@WebAppConfigurationが注入されていません

は私のテストである:ここでは

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { JpaTestConfig.class }) 

@WebAppConfiguration 
public class HomeControllerTest { 

@Resource 
private WebApplicationContext webApplicationContext; 

private MockMvc mockMvc; 

@Test 
public void testRoot() throws Exception { 
    mockMvc.perform(get("/").accept(MediaType.TEXT_PLAIN)).andDo(print()) 
      // print the request/response in the console 
      .andExpect(status().isOk()).andExpect(content().contentType(MediaType.TEXT_PLAIN)) 
      .andExpect(content().string("Hello World!")); 
} 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 
} 

は私の関連のpom.xmlです:

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.3</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.10</version> 
    <scope>test</scope> 
<exclusions> 
    <exclusion> 
     <artifactId>hamcrest-core</artifactId> 
     <groupId>org.hamcrest</groupId> 
    </exclusion> 
</exclusions> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>3.2.1.RELEASE</version> 
</dependency> 

私は、次のテスト構成クラスを持っている:

@Configuration 
@EnableTransactionManagement 
@ComponentScan(basePackages = { "com.myproject.service", "com.myproject.utility", 
     "com.myproject.controller" }) 
@ImportResource("classpath:applicationContext.xml") 
public class JpaTestConfig { 
@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 
... 
} 

// various other services/datasource but not controllers 
} 

それは私の理解であります@WebAppConfigurationを追加するとSpringに強制的に挿入されます。私は、Eclipse内からこのテストを実行するときしかし、私は得る:

によって引き起こさ

: org.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ なし 予選豆[org.springframework.web.context.WebApplicationContext] 依存関係が見つかりました:autowireとなる少なくとも1つのbeanが必要です。この依存関係の候補は です。依存注釈: でorg.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967) で{@ org.springframework.beans.factory.annotation.Autowired(=真必須)} ORG org.springframework.beansで.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749)で(DefaultListableBeanFactory.java:837) .factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)

アップデート - 私は

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "...." }) 
@EnableTransactionManagement 
@ImportResource("classpath:applicationContext.xml") 
public class JpaTestConfig extends WebMvcConfigurationSupport { 

を私のテストのJava Configurationクラスを変更しなければならなかったしかし、問題は、私は私のRESTサービスを呼び出すことができるということになりましたが、それはデータベース呼び出しを含むいくつかの他のサービスを、起動されます。コールと嘲笑された応答をテストするための好ましい方法は何ですか?有効な条件と無効な条件をテストしたいと思います。

答えて

0

なぜこのアノテーションを追加して、それが機能するか確認してください。 XXXX-text.xmlをBeanマッピングXMLに置き換えます。私の場合は

@ContextConfiguration(locations={"classpath:/XXXX-test.xml"}) 
+0

私は豆が@Configurationにマッピングされてい: – sonoerin

+1

それは私が私のテストの設定クラスに以下を追加する必要が判明: @EnableWebMvc @ComponentScan(...) JpaTestConfigはWebMvcConfigurationSupport – sonoerin

+0

良い検索を拡張します。あなたの質問にこのアップデートを加えてください。または、ビット詳細で質問に答えてみてください。 –

21

問題は交換することによって解決されています

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { ... }) 

@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { ... }) 

お知らせローダークラス名でウェブで。以前のローダーでは、@WebAppConfiguration注釈にもかかわらずGenericApplicationContextが注入されています。

+1

恐ろしい!私はSpring 4.2を使用しており、この問題を解決するために多くを探しました。 '@WebAppConfiguration'も追加しましたが、うまくいきませんでした。これは私の問題を解決しました。 –

+1

これは正解です。 – eis

+0

これはまさに私の問題の正しい修正です!また、代わりに、私は単純に "@ContextConfiguration"から "ローダー"を削除したので、AnnotationConfigContextLoaderは '@WebAppConfiguration' – dchang

5

以下の設定では、Java設定クラスのみが使用され、うまく動作します。

@WebAppConfiguration 
@ContextConfiguration(classes = TestApplicationContext.class) 
public class MyClassTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext wac; 

    @Before 
    public void setUp() { 
     mockMvc = webAppContextSetup(wac).build(); 
    } 
    ....  
} 

@Configuration 
public class TestApplicationContext { 

    @Bean 
    public MyBean myBeanId(){ 
     return Mockito.mock(MyBean.class); 
    } 
    .... 
} 

テストクラス上の@WebAppConfigurationの単なる存在はWebApplicationContextは、ウェブアプリケーションのルートへのデフォルトのパスを使用して、テストのためにロードされることを保証します。したがって、WebApplicationContextをautowireしてmockMvcを設定することができます。

@WebAppConfigurationは、テストクラス内の@ContextConfigurationと組み合わせて使用​​する必要があることに注意してください。

関連する問題