Maven не видит некоторые текстовые файлы, которые я использую в своих модульных тестах - PullRequest
2 голосов
/ 30 ноября 2011

Я промочил ноги Мэйвену, но это крутой курс обучения. Я пытаюсь загрузить текстовые файлы из модульного теста. Тесты пройдены, теперь я преобразовал проект в проект maven, похоже, тесты не могут определить, где находятся тестовые файлы.


// I have the following test that I would like to run:

package net.stevenpeterson.base;

import static org.junit.Assert.*;

import net.stevenpeterson.base.LoadStringUtility;

import org.junit.Test;

public class LoadStringUtilityTest {

    @Test
    public void testSingleLine() {
        assertEquals("Loading File", "This is a test." , loadFile("singleLine") );
    }

    @Test
    public void testSeveralLines() {
        assertFalse("Compare a string appended with extra lines, should not compare true. ", "This is a test.".equals(loadFile("severalLines")) );
    }

    @Test
    public void loadSherlockHolmes() {
        String fileToLoad = "cano.txt";
        try{
        StringBuilder holmesCanon = LoadStringUtility.LoadString(fileToLoad);

        System.out.println("Finished Loading file: chars read=" + holmesCanon.length());
        assertTrue("loading size of file:", true);
        }catch(Exception e){
         fail("Exception thrown while loading: " + fileToLoad);
        }

    }


    private String loadFile(String fileName) {
        StringBuilder loadedFromFile = new StringBuilder();
        try {
            loadedFromFile = LoadStringUtility.LoadString(fileName);
        } catch (Exception e) {
            fail("Unable to find load file: " + fileName);
            e.printStackTrace();
        }
        return loadedFromFile.toString();
    }
}

Вот мой файл 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">
      <modelVersion>4.0.0</modelVersion>

      <groupId>net.stevenpeterson</groupId>
      <artifactId>bookreader</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>

      <name>bookreader</name>
      <url>http://maven.apache.org</url>

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

      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>

    <build>
        <testResources>
          <testResource>
            <directory>src/test/resources</directory>
          </testResource>
        </testResources>
    </build>

    </project>

Когда я запускаю юнит-тесты:


steven@steven-desktop:~/maven-conversion/bookreader$ mvn test
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building bookreader 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ bookreader ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/steven/maven-conversion/bookreader/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ bookreader ---
[INFO] Compiling 3 source files to /home/steven/maven-conversion/bookreader/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ bookreader ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ bookreader ---
[INFO] Compiling 5 source files to /home/steven/maven-conversion/bookreader/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ bookreader ---
[INFO] Surefire report directory: /home/steven/maven-conversion/bookreader/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.stevenpeterson.base.LoadStringUtilityTest
Tests run: 3, Failures: 3, Errors: 0, Skipped: 0, Time elapsed: 0.041 sec <<< FAILURE!
Running net.stevenpeterson.base.SplitStringUtilityTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec
Running net.stevenpeterson.booksplitter.BookSplitterTest
Tests run: 4, Failures: 4, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec <<< FAILURE!

Results :

Failed tests: 
  testSingleLine(net.stevenpeterson.base.LoadStringUtilityTest): Unable to find load file: singleLine
  testSeveralLines(net.stevenpeterson.base.LoadStringUtilityTest): Unable to find load file: severalLines
  loadSherlockHolmes(net.stevenpeterson.base.LoadStringUtilityTest): Exception thrown while loading: cano.txt
  ThirdLineOfAlphabetTest(net.stevenpeterson.booksplitter.BookSplitterTest): IOException thrown while loading test file.
  OutOfRangeLineOfAlphabetTest(net.stevenpeterson.booksplitter.BookSplitterTest): IOException thrown while loading test file.
  SectionSizeTwoAlphabetTest(net.stevenpeterson.booksplitter.BookSplitterTest): IOException thrown while loading test file.
  LastLineOfAlphabetTest(net.stevenpeterson.booksplitter.BookSplitterTest): IOException thrown while loading test file.

>     Tests run: 12, Failures: 7, Errors: 0, Skipped: 0
>     
>     [INFO] ------------------------------------------------------------------------
>     [INFO] BUILD FAILURE
>     [INFO] ------------------------------------------------------------------------
>     [INFO] Total time: 1.634s
>     [INFO] Finished at: Tue Nov 29 19:41:59 MST 2011
>     [INFO] Final Memory: 15M/105M
>     [INFO] ------------------------------------------------------------------------
>     [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test
> (default-test) on project bookreader: There are test failures.
>     [ERROR] 
>     [ERROR] Please refer to /home/steven/maven-conversion/bookreader/target/surefire-reports for
> the individual test results.
>     [ERROR] -> [Help 1]
>     [ERROR] 
>     [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
>     [ERROR] Re-run Maven using the -X switch to enable full debug logging.
>     [ERROR] 
>     [ERROR] For more information about the errors and possible solutions, please read the following articles:
>     [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException


Contents of: /home/steven/maven-conversion/bookreader/target/test-classes
AlphabetTest  cano.txt  net/  severalLines  singleLine

It looks as if Maven is placing the resources in the correct location, I think I'm confused about the relative path that is being used when I execute my tests.

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

Я обычно помещаю текстовые файлы, связанные с тестами, в каталог src / test / resources данного проекта (вместе с модульными тестами src / test / java), который является каталогом по умолчанию для тестирования файлов ресурсов ...похоже, что вы, вероятно, делаете это, просматривая файл pom.xml.Кстати, поскольку это местоположение по умолчанию, вам, вероятно, не нужно вызывать его.

Из модульных тестов вы можете загрузить эти файлы с помощью загрузчика классов:

InputStream is = SomeClass.class.getResourceAsStream("cano.txt";);

Кажется, что ваша проблема может быть в вашем классе LoadStringUtility.Не зная, как выглядит ваша LoadStringUtility, я не могу дать вам указания о том, что может быть не так.

Похоже, вы загружаете поток в строку.Обычно я использовал бы вспомогательный класс Apache Commons IO IOUtils для извлечения содержимого входного потока в строку:

String output = IOUtils.toString(is);

, что может привести к LoadStringUtility, которая будет выглядеть следующим образом:

public class LoadStringUtility {

    public static String loadStringFromFile(String file) throws IOException {
        InputStream inputStream = LoadStringUtility.class.getClassLoader().getResourceAsStream(file);
        return IOUtils.toString(inputStream);
    }
}
0 голосов
/ 04 декабря 2011

В этом случае, к лучшему или к худшему, все, что я ищу, - это путь к конкретному ресурсу. Информация, приведенная в ответах, помогла мне собрать следующее:
пакет net.stevenpeterson.bookreaderlib;

import java.net.URL;

public class ResourceLookup {

    private ResourceLookup(){
    }

    public static String getPathForResource(String name){
        ResourceLookup lookupInstance = new ResourceLookup();
        URL aURL = lookupInstance.getClass().getClassLoader().getResource(name);
        return aURL.getPath();
    }
}

После этого я изменил тестовый класс:

package net.stevenpeterson.bookreaderlib;

import static org.junit.Assert.*;    

import net.stevenpeterson.bookreaderlib.LoadStringUtility;
import net.stevenpeterson.bookreaderlib.ResourceLookup;

import org.junit.Before;
import org.junit.Test;

public class LoadStringUtilityTest {


    private String singleLine;
    private String severalLines;
    private String cano;



    @Test 
    public void testGetURLMethod(){
        String resourcePath = ResourceLookup.getPathForResource("singleLine");
        assertNotNull("URL to singleLine should not be null", resourcePath);
    }

    @Test
    public void testSingleLine() {
        assertEquals("Loading File", "This is a test." , loadFile(singleLine) );
    }

    @Test
    public void testSeveralLines() {
        assertFalse("Compare a string appended with extra lines, should not compare true. ", "This is a test.".equals(loadFile(severalLines)) );
    }

    @Test
    public void loadSherlockHolmes() {
        String fileToLoad = this.cano;
        try{
        StringBuilder holmesCanon = LoadStringUtility.LoadString(fileToLoad);
        System.out.println("Finished Loading file: chars read=" + holmesCanon.length());
        assertTrue("loading size of file:", true);
        }catch(Exception e){
         fail("Exception thrown while loading: " + fileToLoad);
        }

    }


    private String loadFile(String fileName) {
        StringBuilder loadedFromFile = new StringBuilder();
        try {
            loadedFromFile = LoadStringUtility.LoadString(fileName);
        } catch (Exception e) {
            fail("Unable to find load file: " + fileName);
            e.printStackTrace();
        }
        return loadedFromFile.toString();
    }


    @Before
    public void loadAllResources(){
        **this.singleLine = ResourceLookup.getPathForResource("singleLine");
        this.severalLines = ResourceLookup.getPathForResource("severalLines");
        this.cano = ResourceLookup.getPathForResource("cano.txt");**
    }
}
0 голосов
/ 30 ноября 2011

Кстати, вам не нужно указывать src/test/resources для build, как это по умолчанию в случае.

Просьба подтвердить, что <your_app_base_path>/target/test-classes.

Я не знаю, как вызагружаются, но вы можете обратиться к моему ответу на Загрузка файла свойств, читая построчно из другого файла

Я обновляю здесь для удобства доступа, а также с некоторыми исправлениями:

package testing.project;

import java.io.*;

enum PathType {RESOURCE, ABSOLUTE}

private static InputStream createInputStream(String line, PathType pathType) {
    InputStream in = null;
    if (pathType == PathType.RESOURCE)
        in = PropertyTest.class.getResourceAsStream(line);
    else {
        try {
            in = new FileInputStream(line);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    return in;
}

Код для его вызова.Существуют различные способы.

  • Если вы хотите загрузить свойства из базы загрузчика классов.Например, если я запускаю свое приложение с функцией main из eclipse, моя база будет <some_path>/classes.Таким образом, файл label.properties находится там.Также, если вы работаете с Tomcat и label.properties лежит в <your_web_app>/classes.В maven, если запущены тестовые случаи, это будет в <app_base_path>/target/test-classes иначе <app_base_path>/target/classes.используйте следующий код:

    createInputStream("/" + line, PathType.RESOURCE); // Load from base path of class loader

  • Если вы хотите загрузить свойства из папки пакета загрузчика классов.Например, если я запускаю свое приложение с функцией main из eclipse, моя база будет <some_path>/classes.Файл label.properties находится в <some_path>/classes/testing/project.Также, если вы работаете с Tomcat и label.properties лежит в <your_web_app>/classes/testing/project, используйте следующий код:

    createInputStream(line, PathType.RESOURCE); // Load from base path of class loader + the package path

  • Если вы хотите загрузить свойства из любого абсолютногопуть на вашем жестком диске.Используйте следующий код:

    createInputStream("C:\\apps\\apache\\tomcat7\\webapps\\examples\\WEB-INF\\classes\\" + line, PathType.ABSOLUTE);

ПРИМЕЧАНИЕ: Pls обрабатывает исключение в соответствии с вашими потребностями.Также измените его в соответствии с вашими потребностями или если я пропустил импорт.Maven будет вести себя одинаково в двух последних случаях, упомянутых в первом, просто используйте здравый смысл.

...