java - WebAppConfiguration 不能很好地与 ContextConfiguration 配合使用?

标签 java spring unit-testing spring-mvc

我有一个使用 Spring MVC 3.2.1 的现有 Java 应用程序。现有的单元测试都可以正常工作。现在我正在尝试一个新的单元测试,第一次使用 @WebAppConfiguration 批注,它因一个古怪的错误而爆炸。

这是我的新单元测试,几乎一字不差地取自 this page :

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"classpath:war-test-context.xml"})
@Transactional
public class GenericPageControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = webAppContextSetup(this.webApplicationContext).build();
    }

    @Test
    public void testControllerSecurityTestThingyTestWithALongNameTest() throws Exception {
        this.mockMvc.perform(get("/payOptions.html"))
        .andExpect(redirectedUrl("/login.html"));
    }

}

这是我遇到的错误:

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [war-test-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [war-test-context.xml]: Cannot resolve reference to bean 'persistenceUnitManager' while setting bean property 'persistenceUnitManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistenceUnitManager' defined in class path resource [war-test-context.xml]: Cannot resolve reference to bean 'caDataSource' while setting bean property 'dataSources' with key [TypedStringValue: value [caDataSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caDataSource': Invocation of init method failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [war-test-context.xml]: Cannot resolve reference to bean 'persistenceUnitManager' while setting bean property 'persistenceUnitManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistenceUnitManager' defined in class path resource [war-test-context.xml]: Cannot resolve reference to bean 'caDataSource' while setting bean property 'dataSources' with key [TypedStringValue: value [caDataSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caDataSource': Invocation of init method failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistenceUnitManager' defined in class path resource [war-test-context.xml]: Cannot resolve reference to bean 'caDataSource' while setting bean property 'dataSources' with key [TypedStringValue: value [caDataSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caDataSource': Invocation of init method failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caDataSource': Invocation of init method failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to populate database; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/database/myapp_schema.sql]
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/database/myapp_schema.sql]

其他仅使用 @ContextConfiguration 注释的测试会找到这个文件并实例化这个 bean 就好了。谁能告诉我为什么 @WebAppConfiguration bean 会抛出它?这是它告诉我不起作用的配置部分:

<jdbc:embedded-database id="caDataSource" type="HSQL">
    <jdbc:script location="database/myapp_schema.sql"/>
    <jdbc:script location="database/myapp_data.sql"/>
</jdbc:embedded-database>

文件在类路径中,但它们在不同的项目中——这可能是唯一的问题。有人有任何想法或方便的链接吗?

最佳答案

看起来像this is the reason .

当您使用 WebApplicationContext 时,您将失去使用类路径的能力:配置或其他内容,并且仅限于/src/main/webapp(或提供的其他位置)中的任何内容。

WebAppContext javadoc 是 here .

关于java - WebAppConfiguration 不能很好地与 ContextConfiguration 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23685499/

相关文章:

java - 从 application.properties Spring Boot 中读取值

unit-testing - 使用 OpenEJB 进行 EJB 存储库测试 - 如何回滚更改

Python:使用用于单元测试的文件创建模拟或假目录

unit-testing - Spring集成测试流程异常

java - mac终端java错误解读

java - 请求开发基于 GWT 的 Web 2.0 应用程序的建议

java - 将加密的 AES key 导入 Android Keystore 并将其存储在新别名下

java - 如何使用 String 的 replaceAll 在某些字符前面不替换

java - 使用 Maven 3 避免子依赖项覆盖父依赖项

javascript - 默认值 f :textarea