Spring3.2.1を使用してspring-mvcテストを作成しようとしています。いくつかのチュートリアルに従って、これは簡単だと思いました。
これが私のテストです:
@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]の修飾Beanが見つかりません:この依存性の自動配線候補として適格なBeanが少なくとも1つ必要です。依存関係のアノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.Java:967)atorg.springframework.beans。 factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.Java:837)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.Java:749)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ Autowire inject(AutowiredAnnotationBeanPostProcessor.Java:486)
更新-テストを変更する必要がありましたJava構成クラス
@Configuration
@EnableWebMvc
@ComponentScan( basePackages = { "...." } )
@EnableTransactionManagement
@ImportResource( "classpath:applicationContext.xml" )
public class JpaTestConfig extends WebMvcConfigurationSupport {
ただし、問題は、RESTサービスを呼び出すことができるということですが、データベース呼び出しを含む他のいくつかのサービスを呼び出しています。呼び出しとモック応答をテストするための推奨される方法は何ですか。有効な条件と無効な条件をテストしたいと思います。
私の場合、問題は次のものを置き換えることで解決されました。
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { ... })
と
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { ... })
ローダークラス名のWebに注意してください。以前のローダーでは、@WebAppConfiguration
アノテーションにもかかわらず、GenericApplicationContext
が挿入されていました。
以下のセットアップは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が存在するだけで、Webアプリケーションのルートへのデフォルトパスを使用してWebApplicationContextがテスト用にロードされます。したがって、WebApplicationContextを自動配線し、それを使用してmockMvcを設定できます。
@WebAppConfigurationは、テストクラス内で@ContextConfigurationと組み合わせて使用する必要があることに注意してください。
テストの1つは、アノテーションヘッダーを使用したローカル開発サポートで利用できます。質問から同様の問題が発生しました。
コメントは、このテストの以前のバージョンです。
@RunWith(SpringJUnit4ClassRunner.class)
/* @EnableJpaAuditing */ /* for jpa dates */ /* it should be defined only once,
because 'jpaAuditingHandler' defined in null on application startup */
@EntityScan(basePackageClasses = { EnableJpaAuditing.class, Jsr310JpaConverters.class })
//@ProfileValueSourceConfiguration(Application.class)
//@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
//@PropertySource("classpath:application.properties")
@TestPropertySource(locations = "classpath:application.properties")
//@WebAppConfiguration
@SpringBootTest
public class JpaTests {/* */}
この注釈を追加して、機能するかどうかを確認してみませんか。 XXXX-text.xmlをBeanマッピングxmlに置き換えます。
@ContextConfiguration(locations={"classpath:/XXXX-test.xml"})