Pergunta

Eu tenho uma grande propagação aplicativo em vários arquivos de definição XML feijão Primavera. Na minha suíte de testes eu carregar manualmente os arquivos XML que eu preciso usar um FileSystemXmlApplicationContext para realizar os testes, eu quero correr. Isso reduz conjunto de teste de tempo e me permite usar os mesmos arquivos de configuração exatas que são utilizados na produção.

Agora eu estou tentando usar classes base de teste transacionais do Spring que levam os locais de configuração e carregar o contexto para mim. Por alguma razão, quando o contexto de aplicação é criada Primavera não pode encontrar qualquer um dos arquivos de configuração. Esta é confuso porque eu executar o teste a partir do mesmo diretório de trabalho como quando eu carregar a configuração me usando FileSystemXmlApplicationContext. Se eu preceder todos os meus locais de configuração com "file:" os caminhos que eu especificar no meu teste são encontrados, mas os arquivos que são importados ou referenciados por beans definidos na configuração (por exemplo, arquivos de propriedades) não pode ser encontrada. Qual é o problema? Posso obter provas que se estendem as classes de teste contexto mola para trabalhar o mesmo que aqueles onde eu criar o contexto mim?

Por exemplo, criar o contexto como esse bem funciona:

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

Se eu estender AbstractTransactionalDataSourceSpringContextTests o seguinte não encontrar serviços de context.xml:

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

Isso encontra serviços de contexto, mas o PropertyPlaceholderConfigurer definido lá não consegue encontrá-lo de arquivos de propriedades.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
Foi útil?

Solução 2

Além de substituir getConfigLocations Eu também cancelou loadContext e usou uma fileSystemXmlApplicationContext fiel lá.

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

Outras dicas

Nós colocamos toda a nossa configuração Primavera e arquivos de propriedades no classpath, o que mantém as coisas simples - podemos simplesmente estender nossas classes de teste de uma classe base como:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

Aqui, os caminhos são todos os caminhos no classpath.

Se você não quiser fazer isso, você tem verificado como você está referenciando os arquivos de propriedades em sua serviços de context.xml? Eu suspeito que se você adicionar o arquivo: a sua configuração contexto, então você também precisa adicionar isto a sua referência de arquivo propriedade. Você poderia talvez apenas usar um arquivo de configuração de teste Primavera separado para alterar a definição de seu espaço reservado propriedade e colocar isso no final da sua lista de arquivos de contexto -. Suas definições, então, substituir aqueles definidos em arquivos anteriores

As suas localizações configuração são URIs relativos, e será interpretado como tal pela classe de teste base, com o URI a ser resolvido em relação à localização da classe de teste em si. Tente usar URIs totalmente qualificados, ou utilizar tomada URI relativo em conta onde a classe de teste é.

Você não pode usar classpath fábricas XML como ClassPathXmlApplicationContext ?

Outra solução possível é duplicar a services-config.xml e renomeação como services-config-test.xml e depois colocado sob classpath. A mesma coisa vale para o arquivo de propriedades.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top