繁体   English   中英

使用 maven 时无法读取图像

[英]Not being able to read images when using maven

我目前正在为我正在制作的游戏进行单元测试,并且遇到了 maven 的奇怪错误,我无法弄清楚。

我已经运行mvn clean ,现在我的测试失败了。

这是我运行mvn test -X时遇到的错误:

[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[DEBUG] Determined Maven Process ID 15842
[DEBUG] boot classpath:  /home/coseto/.m2/repository/org/apache/maven/surefire/surefire-booter/2.22.1/surefire-booter-2.22.1.jar  /home/coseto/.m2/repository/org/apache/maven/surefire/surefire-api/2.22.1/surefire-api-2.22.1.jar  /home/coseto/.m2/repository/org/apache/maven/surefire/surefire-logger-api/2.22.1/surefire-logger-api-2.22.1.jar  /home/coseto/CMPT276/project/project/target/test-classes  /home/coseto/CMPT276/project/project/target/classes  /home/coseto/.m2/repository/junit/junit/4.11/junit-4.11.jar  /home/coseto/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar  /home/coseto/.m2/repository/org/openjfx/javafx-controls/16/javafx-controls-16.jar  /home/coseto/.m2/repository/org/openjfx/javafx-controls/16/javafx-controls-16-linux.jar  /home/coseto/.m2/repository/org/openjfx/javafx-graphics/16/javafx-graphics-16.jar  /home/coseto/.m2/repository/org/openjfx/javafx-graphics/16/javafx-graphics-16-linux.jar  /home/coseto/.m2/repository/org/openjfx/javafx-base/16/javafx-base-16.jar  /home/coseto/.m2/repository/org/openjfx/javafx-base/16/javafx-base-16-linux.jar  /home/coseto/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.22.1/surefire-junit4-2.22.1.jar
[DEBUG] boot(compact) classpath:  surefire-booter-2.22.1.jar  surefire-api-2.22.1.jar  surefire-logger-api-2.22.1.jar  test-classes  classes  junit-4.11.jar  hamcrest-core-1.3.jar  javafx-controls-16.jar  javafx-controls-16-linux.jar  javafx-graphics-16.jar  javafx-graphics-16-linux.jar  javafx-base-16.jar  javafx-base-16-linux.jar  surefire-junit4-2.22.1.jar
[DEBUG] Forking command line: /bin/sh -c cd /home/coseto/CMPT276/project/project && /usr/lib/jvm/java-11-openjdk-amd64/bin/java -jar /home/coseto/CMPT276/project/project/target/surefire/surefirebooter11758842836664561521.jar /home/coseto/CMPT276/project/project/target/surefire 2021-12-02T21-14-55_342-jvmRun1 surefire9176235482268566905tmp surefire_012726690917142737821tmp
[INFO] Running G20.CollisionScoreIntegrationTest
[ERROR] Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.315 s <<< FAILURE! - in G20.CollisionScoreIntegrationTest
[ERROR] collidingWithOptionalReward(G20.CollisionScoreIntegrationTest)  Time elapsed: 0.289 s  <<< ERROR!
java.lang.IllegalArgumentException: input == null!
        at G20.CollisionScoreIntegrationTest.setup(CollisionScoreIntegrationTest.java:24)

[ERROR] collidingWithReward(G20.CollisionScoreIntegrationTest)  Time elapsed: 0 s  <<< ERROR!
java.lang.IllegalArgumentException: input == null!
        at G20.CollisionScoreIntegrationTest.setup(CollisionScoreIntegrationTest.java:24)

[ERROR] collidingWithAllThree(G20.CollisionScoreIntegrationTest)  Time elapsed: 0.001 s  <<< ERROR!
java.lang.IllegalArgumentException: input == null!
        at G20.CollisionScoreIntegrationTest.setup(CollisionScoreIntegrationTest.java:24)

[ERROR] collidingWithPunishment(G20.CollisionScoreIntegrationTest)  Time elapsed: 0 s  <<< ERROR!
java.lang.IllegalArgumentException: input == null!
        at G20.CollisionScoreIntegrationTest.setup(CollisionScoreIntegrationTest.java:24)

[INFO] Running G20.movementListenerTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.089 s - in G20.movementListenerTest
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR]   CollisionScoreIntegrationTest.setup:24 » IllegalArgument input == null!
[ERROR]   CollisionScoreIntegrationTest.setup:24 » IllegalArgument input == null!
[ERROR]   CollisionScoreIntegrationTest.setup:24 » IllegalArgument input == null!
[ERROR]   CollisionScoreIntegrationTest.setup:24 » IllegalArgument input == null!
[INFO]
[ERROR] Tests run: 9, Failures: 0, Errors: 4, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.746 s
[INFO] Finished at: 2021-12-02T21:14:56-08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project project: There are test failures.
[ERROR]
[ERROR] Please refer to /home/coseto/CMPT276/project/project/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project project: There are test failures.

Please refer to /home/coseto/CMPT276/project/project/target/surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.

Please refer to /home/coseto/CMPT276/project/project/target/surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    at org.apache.maven.plugin.surefire.SurefireHelper.throwException (SurefireHelper.java:289)
    at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution (SurefireHelper.java:161)
    at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary (SurefirePlugin.java:364)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked (AbstractSurefireMojo.java:1041)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute (AbstractSurefireMojo.java:857)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[ERROR]
[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

这是我的 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>G20</groupId>
  <artifactId>project</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>project</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <javafx.version>16</javafx.version>
    <javafx.maven.plugin.version>0.0.6</javafx.maven.plugin.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>${javafx.version}</version>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <goals>
                    <goal>java</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <mainClass>G20.Main</mainClass>
        </configuration>
      </plugin>
        <plugin>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-maven-plugin</artifactId>
          <version>0.0.8</version>
          <configuration>
            <mainClass>G20.Main</mainClass>
          </configuration>
        </plugin>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

这是 Junit 测试的代码:

package G20;
import org.junit.*;

import G20.Listener;

import java.util.ArrayList;

import static org.junit.Assert.*;

public class CollisionScoreIntegrationTest {
    CollisionHandler handler;
    Player player;
    Exit exit;
    ArrayList<Punishment> punishments;
    ArrayList<OptionalReward> optional_rewards;
    ArrayList<Enemy> enemies;
    ArrayList<Reward> rewards;

    /**
     * To be done before every test. Creates a new player to be tested on for each test
     */
    @Before
    public void setup(){
        player = new Player(0,0);
    }

    /**
     * Tests if the players score is updated by + 10 when it collides with a reward.
     */
    @Test
    public void collidingWithReward(){
        //generating empty arraylist + dummy values for the collision handler's constructor
        rewards = new ArrayList<Reward>();
        punishments= new ArrayList<Punishment>();
        optional_rewards = new ArrayList<OptionalReward>();
        enemies = new ArrayList<Enemy>();
        exit = new Exit(111,111);
        //adding the reward we want to test collision with in the rewards arraylist
        rewards.add(new Reward(32,0));
        handler = new CollisionHandler(player, enemies, rewards, optional_rewards, punishments, exit);
        handler.handleCollisions();
        assertEquals(10, player.getScore());    
    }

    /**
     * Tests if the players score is updated by -11 when it collides with a reward
     */
    @Test
    public void collidingWithPunishment(){
        //generating empty arraylist + dummy values for the collision handler's constructor
        rewards = new ArrayList<Reward>();
        punishments= new ArrayList<Punishment>();
        optional_rewards = new ArrayList<OptionalReward>();
        enemies = new ArrayList<Enemy>();
        exit = new Exit(111,111);
        //adding the punishment we want to test collision with in the punishments arraylist
        punishments.add(new Punishment(32,0));
        handler = new CollisionHandler(player, enemies, rewards, optional_rewards, punishments, exit);
        handler.handleCollisions();
        assertEquals(-11, player.getScore());    
    }

    /**
     * Tests if the players score is updated by +25 when it collides with a optional reward
     */
    @Test
    public void collidingWithOptionalReward(){
        //generating empty arraylist + dummy values for the collision handler's constructor
        rewards = new ArrayList<Reward>();
        punishments= new ArrayList<Punishment>();
        optional_rewards = new ArrayList<OptionalReward>();
        enemies = new ArrayList<Enemy>();
        exit = new Exit(111,111);
        //adding the optional reward we want to test collision with in the optional rewards arraylist
        optional_rewards.add(new OptionalReward(32,0));
        //setting the collision to on because collision defaults to off for optional rewards
        optional_rewards.get(0).collision_on = true;
        handler = new CollisionHandler(player, enemies, rewards, optional_rewards, punishments, exit);
        handler.handleCollisions();
        assertEquals(25, player.getScore());    
    }

    /**
     * Tests if the players score is updated by +(25+10-11) when it collides with all 3 of the above entities
     */
    @Test
    public void collidingWithAllThree(){
        //generating empty arraylist + dummy values for the collision handler's constructor
        rewards = new ArrayList<Reward>();
        punishments= new ArrayList<Punishment>();
        optional_rewards = new ArrayList<OptionalReward>();
        enemies = new ArrayList<Enemy>();
        exit = new Exit(111,111);
        //adding all the score modifying entities that are being testing to their respective ArrayList
        optional_rewards.add(new OptionalReward(32,0));
        rewards.add(new Reward(-32, 0));
        punishments.add(new Punishment(0, 32));
        //setting the collision to on because collision defaults to off for optional rewards
        optional_rewards.get(0).collision_on = true;
        handler = new CollisionHandler(player, enemies, rewards, optional_rewards, punishments, exit);
        handler.handleCollisions();
        assertEquals(24, player.getScore());    
    }

}

这是我收到错误的代码:

package G20;

import java.util.*;


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
/**
 * The class for the Player
 */
public class Player extends AnimateEntity{
    
    /**
     * Constructor calls super constructor, sets sprites
     * @param x_pos
     * @param y_pos
     * @param sprites
     */
    public Player(int x_pos, int y_pos){
        super(x_pos, y_pos);
        //populating the sprite array list
        sprites = new ArrayList<BufferedImage>();
        try{
            sprites.add(ImageIO.read(getClass().getResourceAsStream("Sprites/player_1.png")));
            } catch(IOException e){
                e.printStackTrace();
            }
        try{
            sprites.add(ImageIO.read(getClass().getResourceAsStream("Sprites/player_2.png")));
            } catch(IOException e){
                e.printStackTrace();
            }
        setSprite(sprites.get(0));
        speed = 4;
    }
}

我很确定它与 maven 文件有关,但我不确定它是什么。 也许与我正在使用的图像阅读库有关? 任何帮助将不胜感激。

您遇到的问题是您的测试无法实例化 Player(测试类的第 24 行)。 尝试时将无法找到精灵资源,如果基础 class AnimateEntity 正在做额外的工作,则可能会出现其他故障。

理想情况下,您应该在测试用例中使用 Mock object。 这样,它们就不会依赖于可能可用也可能不可用的资源。

如果您绝对需要资源来执行测试,则需要配置 maven 以将它们复制到目标文件夹,以便您的测试可以访问它们。

此链接提供有关如何设置项目以使用目标目录中的资源的信息。

从 JUnit 测试用例中找不到资源文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM