Home > Net >  Not being able to read images when using maven
Not being able to read images when using maven

Time:12-04

I'm currently working on unit tests for a game that I'm making and am running into a weird error with maven that I can't figure out.

I've run mvn clean and now my tests are failing.

Here is the error I get when I run 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

Here is my Maven file:

<?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>

Here is the code for the Junit test:

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());    
    }

}

And here is the code where I am getting the error:

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;
    }
}

I'm pretty sure it has something to do with the maven file but I am not sure what it is. Maybe something with the image reading library I am using? Any help would be greatly appreciated.

CodePudding user response:

The issue you're running into is that your test can't instantiate a Player (Line 24 of your test class). It'll fail to find the sprite resources when trying, and possibly have other failures if it's base class AnimateEntity is doing additional work.

Ideally, you should use a Mock object for use in your test cases. That way they aren't dependent on resources that may or may not be available.

If you absolutely need the resources to perform your tests, you need to configure maven to copy them to a target folder so that your tests can access them.

This link gives info on how to setup your project to use resources from a target directory.

Resource files not found from JUnit test cases

  • Related