2014-06-07 25 views
11

Tôi đang cố gắng kiểm tra quy trình đăng nhập bảo mật chính bằng cách chạy thử nghiệm trong Spring Boot, sử dụng, tôi nghĩ những điều mà họ đề xuất.Thử nghiệm khởi động mùa xuân: Không thể khởi động EmbeddedWebApplicationContext do thiếu EmbeddedServletContainerFactory bean

Đây là pom maven:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.touchcorp.xxxxx</groupId> 
    <artifactId>xxxxx-lc</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.0.2.RELEASE</version> 
    </parent> 

<properties> 
    <java.version>1.7</java.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.25</version> 
    </dependency> 

    <!-- Gateway --> 
    <dependency> 
     <groupId>org.jdom</groupId> 
     <artifactId>jdom</artifactId> 
     <version>2.0.2</version> 
    </dependency> 
    <dependency> 
     <groupId>jaxen</groupId> 
     <artifactId>jaxen</artifactId> 
     <version>1.1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jaxrs</artifactId> 
     <version>2.3.5.Final</version> 
    </dependency> 
    <!-- Hashing--> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>17.0</version> 
    </dependency> 

</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 
</project> 

My bối cảnh ứng dụng thử nghiệm:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {MvcConfig.class,SecurityConfig.class}) 
@WebAppConfiguration 
@EnableAutoConfiguration 
@IntegrationTest 
public class TestApplicationContext { 

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
     TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
     factory.setPort(9000); 
     factory.setSessionTimeout(10, TimeUnit.MINUTES); 
     //factory.addErrorPages(new ErrorPage(HttpStatus.404, "/notfound.html")); 
     return factory; 
    } 

} 

và đây là thử nghiệm cụ thể:

@RunWith(SpringJUnit4ClassRunner.class) 
public class ApplicationIntegrationTest extends TestApplicationContext { 

    MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext wac; 

    @Resource(name="springSecurityFilterChain") 
    private FilterChainProxy springSecurityFilterChain; 


    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilter(springSecurityFilterChain).build(); 

    } 

    @Test 
     public void thatViewBootstrapUsesHttpNotFound() throws Exception { 


     MvcResult result = mockMvc.perform(post("/login") 
      .param("username", "user").param("password", "password")).andReturn(); 
     Cookie c = result.getResponse().getCookie("my-cookie"); 
     assertThat(c.getValue().length(), greaterThan(10)); 

     // No cookie; 401 Unauthorized 
     mockMvc.perform(get("/")).andExpect(status().isUnauthorized()); 

     // With cookie; 200 OK 
     mockMvc.perform(get("/").cookie(c)).andExpect(status().isOk()); 

     // Logout, and ensure we're told to wipe the cookie 
     result = mockMvc.perform(delete("/session")).andReturn(); 
     c = result.getResponse().getCookie("my-cookie"); 
     assertThat(c.getValue().length(), is(0)); 
     } 

} 

và đây là lỗi:

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) 
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:135) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:648) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) 
    at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:88) 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64) 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91) 
    ... 28 more 
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:132) 
    ... 35 more 

Như bạn có thể thấy, tôi đã thử xác định vùng chứa trong cấu hình, nhưng điều này dường như không hoạt động. Bất cứ ai có thể cho tôi biết những gì tôi đang mất tích?

cảm ơn

Trả lời

6

Bạn thực sự không thiết lập vùng chứa trong lớp cấu hình, bạn đang thực hiện nó trong lớp thử nghiệm. Di chuyển số @Bean đó sang số @Configuration và bạn có thể có nhiều may mắn hơn.

+2

Đó là nó. Tôi đã xóa chú thích @IntegrationTest khỏi TestApplicationContext và nó đã đi. Cảm ơn bạn rất nhiều. –

+0

Xin chào Michael, bạn có thể giải thích cho dù chỉ cần xóa "@IntegrationTest" khỏi TestApplicationContext làm việc (vì nó không hoạt động cho tôi khi tôi gặp phải vấn đề tương tự - tôi muốn một thùng chứa nhúng chỉ để thử nghiệm) và nếu bạn có nghĩa là gợi ý của @ Dave cũng phải được sử dụng, sau đó thay thế "@Bean" bằng "@Configuration" trong ví dụ của bạn cung cấp cho tôi các lỗi biên dịch cho biết "@Configuration" không được phép ở đó. Bất kỳ con trỏ nào mà bạn có thể đưa ra sẽ giúp ích rất nhiều. Cảm ơn, Paddy – Paddy

+0

Chỉ cần thay thế một chú thích bằng một chú thích khác sẽ không giúp ích gì. Một '@ Bean' là một phương thức. Thêm một lớp và chú thích nó '@ Configuration' và đặt nhà máy chứa trong đó thành' @ Bean', sau đó thêm lớp teh vào ngữ cảnh ứng dụng của bạn. Đừng sao chép mã từ OP (đó là một mớ hỗn độn). –

Các vấn đề liên quan