Я пытаюсь создать тесты spring -mvc, используя Spring 3.2.1. После некоторых уроков я подумал, что это будет прямолинейно.
Вот мой тест:
@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: Нет квалификационный bean типа [org.springframework.web.context.WebApplicationContext] найдено для зависимость: ожидается как минимум 1 bean, которая квалифицируется как autowire кандидат на эту зависимость. Аннотации зависимостей: {@Org.springframework.beans.factory.annotation.Autowired(обязательно = истина)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:837) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
Обновить - мне пришлось изменить класс конфигурации тестовой Java
@Configuration
@EnableWebMvc
@ComponentScan( basePackages = { "...." } )
@EnableTransactionManagement
@ImportResource( "classpath:applicationContext.xml" )
public class JpaTestConfig extends WebMvcConfigurationSupport {
Однако теперь проблема заключается в том, что я могу вызвать службу REST, но она вызывает другие службы, включая вызовы базы данных. Каков предпочтительный способ просто проверить вызов и посмеянный ответ. Я хотел бы проверить допустимые и недействительные условия.