javalearner84
javalearner84

Reputation: 21

How do I include src/test/java files to run TestNG tests?

I'm just learning Java and could use your help. I'm using Eclipse, and created a Maven project using the org.openjfx archetype. Everything seems to work fine except when I try to write tests in src/test/java, which causes an error.

An error occurred while instantiating class starcraft.warcraft.test.TestClass: Unable to make public starcraft.warcraft.test.TestClass() accessible: module starcraft.warcraft does not "exports starcraft.warcraft.test" to module org.testng

This is how I created the project with default settings in Eclipse:

Project Setup with Maven Archetype Selection

Now, when Eclipse creates the project, it doesn't have a src/test/java folder, so I create that manually. Then I create a class called "TestClass" inside a package "starcraft.warcraft.test" inside src/test/java, and I add a simple method to test inside the App class called "adder". You can see the project structure

Project Structure

package starcraft.warcraft;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class App extends Application {

    @Override
    public void start(Stage stage) {
        var javaVersion = SystemInfo.javaVersion();
        var javafxVersion = SystemInfo.javafxVersion();

        var label = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        var scene = new Scene(new StackPane(label), 640, 480);
        stage.setScene(scene);
        stage.show();
    }
    
    // WILL TEST THIS METHOD
    public static int adder(int digit1, int digit2) {
        return digit1 + digit2;
    }
    
    public static void main(String[] args) {
        launch();
    }

}

Now I want to use TestNG for the tests, and so I include it in my POM which is

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>starcraft</groupId>
    <artifactId>warcraft</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.6</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>starcraft.warcraft.App</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

This is the default POM created by the Maven archetype except for the TestNG dependency I added. When I try to use TestNG, Eclipse makes me add it to the module path like so:

Maven saying I need to add the TestNG library

And here is my module-info:

module starcraft.warcraft {
    requires javafx.controls;
    requires org.testng;
    
    exports starcraft.warcraft;
}

OK, all good so far, but now when I try to run my test inside TestClass:

package starcraft.warcraft.test;

import org.testng.annotations.Test;

import starcraft.warcraft.App;

public class TestClass {

    @Test
    public void testAdder() {
        
        int sum = App.adder(1, 2);
        
        System.out.println(sum);
        
    }
}

I get the error, which again is

An error occurred while instantiating class starcraft.warcraft.test.TestClass: Unable to make public starcraft.warcraft.test.TestClass() accessible: module starcraft.warcraft does not "exports starcraft.warcraft.test" to module org.testng

I can't figure out how to do the export. When I try making the entry in module-info, it doesn't give me the option of adding the package in src/test/java, the only packages it allows me to choose from are in src/main/java.

I don't understand modules well. How can I get the program to let me run tests from src/test/java?

Upvotes: 1

Views: 505

Answers (1)

javalearner84
javalearner84

Reputation: 21

Thanks everyone who looked at this. I solved it by following these steps:

  1. Delete module-info.java. This turns it into a nonmodular project which is fine for me. I hesitated to do this because the Maven JavaFX archetype included it, but as it says here somewhere

https://openjfx.io/openjfx-docs/#IDE-Eclipse

you can just delete it after its created.

  1. The problem then if you try to run the project is it will give you a warning that JavaFX isn't included as a module. It will still run, but its best to get rid of this incase of problems down the road. So you need to download the JavaFX libraries, place them in your hard drive, and then include them in your project via VM arguments in Eclipse:

right click project -> Run configuration -> Arguments tab -> add in the VM arguments area something like:

--module-path [fully qualified path to lib folder containing downloaded JavaFX] --add-modules javafx.controls

path would be like "C:\javafx\lib" or wherever you placed the downloaded JavaFX.

Then it should run, and project will still build using Maven, but I'm not sure if its using the JavaFX which is still in the Maven POM or the one I specified on the C drive. But it works. Any help on whats happening there would be appreciated. Thanks

Upvotes: 1

Related Questions