2012-05-03 1 views
4

Нам удалось создать и запустить тесты с интернационализированными историями, используя JBehave в пределах eclipse. Все прошло хорошо.Maven JBehave: история кодирования UTF8

Но когда мы пытались запустить их с помощью подключаемого модуля maven, мы не можем избавиться от проблемы с кодировкой (например, вместо чтения «scénario» из истории, она получает «Scà © nario»: UTF8).

Кто-нибудь нашел способ получить JBehave для чтения историй в UTF8 с помощью плагина maven?

То, что мы уже пробовали:

  • добавив -Dfile.encoding = вариант UTF8
  • изменения файла ключевых слов с помощью UTF8
  • изменения всей кодировки проекта в ISO => который работает, но ISN» т подходит для производства части, которая необходима для отображения сообщений в UTF8

наш pom.xml

<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"> 
... 

<properties> 
    <jbehave.version>3.6.5</jbehave.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <resource.encoding>UTF-8</resource.encoding> 
</properties> 

<build> 

    <testOutputDirectory>target/classes</testOutputDirectory> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
     <testResource> 
      <directory>src/test/story</directory> 
     </testResource> 
    </testResources> 
    <plugins> 
     ... 
     <plugin> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <downloadSources>true</downloadSources> 
       <downloadJavadocs>true</downloadJavadocs> 
       <additionalBuildcommands> 
        <buildcommand>com.google.gdt.eclipse.core.webAppProjectValidator</buildcommand> 
       </additionalBuildcommands> 
       <additionalProjectnatures> 
        <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature> 
       </additionalProjectnatures> 
       <classpathContainers> 
        <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer> 
       </classpathContainers> 
       <additionalConfig> 
        <file> 
         <name>.settings/org.eclipse.core.resources.prefs</name> 
         <content> 
          <![CDATA[eclipse.preferences.version=1 
          encoding/<project>=UTF-8]]> 
         </content> 
        </file> 
       </additionalConfig> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.jbehave</groupId> 
      <artifactId>jbehave-maven-plugin</artifactId> 
      <version>${jbehave.version}</version> 
      <executions> 
       <execution> 
        <id>run-stories-as-embeddables</id> 
        <phase>test</phase> 
        <configuration> 
         <scope>test</scope> 
         <includes> 
          <include>**/*Story.java</include> 
         </includes> 
         <ignoreFailureInStories>true</ignoreFailureInStories> 
         <ignoreFailureInView>false</ignoreFailureInView> 
        </configuration> 
        <goals> 
         <goal>run-stories-as-embeddables</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>unpack-jbehave-site-resources</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <overwriteReleases>false</overwriteReleases> 
         <overwriteSnapshots>true</overwriteSnapshots> 
         <artifactItems> 
          <artifactItem> 
           <groupId>org.jbehave.site</groupId> 
           <artifactId>jbehave-site-resources</artifactId> 
           <version>3.1.1</version> 
           <type>zip</type> 
           <outputDirectory> 
            ${project.build.directory}/jbehave/view 
           </outputDirectory> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
       <execution> 
        <id>unpack-jbehave-reports-resources</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <overwriteReleases>false</overwriteReleases> 
         <overwriteSnapshots>true</overwriteSnapshots> 
         <artifactItems> 
          <artifactItem> 
           <groupId>org.jbehave</groupId> 
           <artifactId>jbehave-core</artifactId> 
           <version>${jbehave.version}</version> 
           <outputDirectory> 
            ${project.build.directory}/jbehave/view 
           </outputDirectory> 
           <includes> 
            **\/*.css,**\/*.ftl,**\/*.js 
           </includes> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    ... 

    <!-- JBehave Dependencies --> 
    <dependency> 
     <groupId>org.jbehave</groupId> 
     <artifactId>jbehave-core</artifactId> 
     <version>${jbehave.version}</version> 
    </dependency> 

    <!-- Test Frameworks Dependencies --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.8.4</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

ответ

3

Я имел некоторый успех подклассов класса org.jbehave.core.io.LoadFromClasspath, который я использую в моей конфигурации, как история загрузчика, т.е.

MostUsefulConfiguration().useStoryLoader(new LoadFromClasspathUtf8()); 

вот мой подкласс с правильным методом замены:

import java.io.IOException; 
import java.io.InputStream; 

import org.apache.commons.io.IOUtils; 
import org.jbehave.core.io.InvalidStoryResource; 
import org.jbehave.core.io.LoadFromClasspath; 

public class LoadFromClasspathUtf8 extends LoadFromClasspath { 

    public LoadFromClasspathUtf8(Class<?> loadFromClass) { 
     super(loadFromClass); 
    } 

    public LoadFromClasspathUtf8(ClassLoader classLoader) { 
     super(classLoader); 
    } 

    @Override 
    public String loadResourceAsText(String resourcePath) { 
     InputStream stream = resourceAsStream(resourcePath); 
     try { 
      return IOUtils.toString(stream, "UTF-8"); 
     } catch (IOException e) { 
      throw new InvalidStoryResource(resourcePath, stream, e); 
     } 
    } 
} 

Я говорю: «Я имел некоторый успех», потому что, когда я смотрю на журналы моего исполнения JBehave, акцентированные французские символы, такие как Е, , é и т. д. заменяются на?, но тогда jbehave по-прежнему правильно соответствует этим шагам, используя обычный RegexStoryParser. Я не нашел времени, чтобы исследовать, почему это так, но я доволен, что мои истории работают правильно.

Я также добавил свойство system.encoding к моей конфигурации плагина, чтобы было ясно, что я намерен использовать кодировку UTF-8.

+0

Спасибо, это также помогло мне правильно запустить тесты в eclipse! – Santosh

0

Поскольку у вас есть свои истории в контексте «тест», а не «главный» (в другом модуле) - я думаю, что есть, вероятно, что-то происходит, когда истории копируются в целевой/тест-классы.

+0

Я думал об этом, поэтому я указал в POM: target/classes, и я проверил, существуют ли классы – antoine

+0

, так что это ваши истории UTF-8 в этом каталоге? –

0

У меня была точно такая же проблема. По умолчанию JBehave не поддерживает кодирование платформы. Для того, чтобы исправить это, вы можете использовать этот обычай StoryLoader, который чтит система file.encoding собственности:

import java.io.IOException; 
import java.io.InputStream; 
import java.nio.charset.Charset; 

import org.apache.commons.io.IOUtils; 
import org.jbehave.core.io.InvalidStoryResource; 
import org.jbehave.core.io.LoadFromClasspath; 

/** 
* @author cedric.vidal 
* 
*/ 
public class FixedStoryLoader extends LoadFromClasspath { 

    public String loadResourceAsText(String resourcePath) { 
     InputStream stream = resourceAsStream(resourcePath); 
     try { 
      return IOUtils.toString(stream, platformCharset().name()); 
     } catch (IOException e) { 
      throw new InvalidStoryResource(resourcePath, stream, e); 
     } 
    } 

    public static Charset platformCharset() { 
     String csn = System.getProperty("file.encoding"); 
     Charset cs = Charset.forName(csn); 
     if (cs == null) { 
      cs = Charset.forName("UTF-8"); 
     } 
     return cs; 
    } 

} 

Зарегистрируйте в конфигурации JBehave с:

new MostUsefulConfiguration().useStoryLoader(new FixedStoryLoader()); 

Настройка POM использовать UTF-8 в все respectfull плагинов (будет использоваться m2eclipse тоже):

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

И скажите JBehave Maven плагин, чтобы использовать его также (обратите внимание на блок systemProperties):

 <plugin> 
      <groupId>org.jbehave</groupId> 
      <artifactId>jbehave-maven-plugin</artifactId> 
      <version>${jbehave.core.version}</version> 
      <executions> 
       <execution> 
        <id>unpack-view-resources</id> 
        <phase>process-resources</phase> 
        <goals> 
         <goal>unpack-view-resources</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>embeddable-stories</id> 
        <phase>integration-test</phase> 
        <configuration> 
         <includes> 
          <include>${embeddables}</include> 
         </includes> 
         <excludes/> 
         <systemProperties> 
          <property> 
           <name>file.encoding</name> 
           <value>${project.build.sourceEncoding}</value> 
          </property> 
         </systemProperties> 
         <ignoreFailureInStories>true</ignoreFailureInStories> 
         <ignoreFailureInView>false</ignoreFailureInView> 
         <threads>1</threads> 
         <metaFilters> 
          <metaFilter/> 
         </metaFilters> 
        </configuration> 
        <goals> 
         <goal>run-stories-as-embeddables</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
1

Такая же проблема здесь также. Даже после добавления параметра «-Dfile.encoding = UTF-8» в MAVEN_OPTS проблема сохранялась. Выверните, что у меня была эта линия в моем файле ~/.mavenrc:

Что происходит переменная MAVEN_OPTS получил сброс перед выполнением JVM.

После изменения файл ~/.mavenrc файл:

export MAVEN_OPTS="$MAVEN_OPTS -Xmx1024m" 

Проблема была решена. Кодировка файла устанавливается правильно при работе:

export MAVEN_OPTS="$MAVEN_OPTS -Dfile.encoding=UTF-8" 
mvn clean integration-test