Computer scienceProgramming languagesJavaPrompt engineering with Java

AI-assisted unit tests in Java

6 minutes read

Unit tests play a crucial role in software development, ensuring that each component of your code functions correctly. Have you ever considered using AI to generate these tests? In this article, we’ll explore how ChatGPT, a language model from OpenAI, can assist in creating unit tests.

Unit testing

Unit testing involves testing individual components of a software application to ensure they function as expected. Units can range from single methods to entire modules.

In practice, you will most likely have methods as units not modules.

Below is a basic example of a unit test in Java:

public int sub(int a, int b) {
    return a - b;
}

The sub method subtracts two numbers. Assume we need to verify if the function above works correctly. For this purpose, you do unit testing. Let's test the subtraction method to ensure it behaves as expected:

@Test
public void testSub() {
    assertEquals(5, sub(8, 3));
}

The unit test above ensures that the subtraction operation performs correctly. Here assertEquals verifies whether the code behaves as expected. If the condition in the assertEquals is true, the test passes. If it's false, the test fails, indicating a possible issue in your code.

How can ChatGPT generate unit tests?

So, can AI produce tests? The answer is YES. By providing ChatGPT with examples of effective unit tests, you can help it learn the necessary patterns. Once it grasps them, it can start generating similar tests on its own in a similar style.

Here’s an example of how you can use ChatGPT to create a unit test for a Java method that calculates the square of a number. We will start by providing ChatGPT with some sample test cases to help it understand how to generate unit tests for us.

To begin, let’s provide ChatGPT with an example of the multiplication method, which will enable it to generate unit tests for the square() method:

Screenshot of a conversation with a code example and request for generating similar tests.

In this sample, the testMultiply method checks if the multiplication result equals to 20 and prints the "Failed to multiply" message if it does not.

Now, let's provide the square method and ask to generate a test:

Screenshot of a chat interface with a code request for a unit test and the provided JUnit test for the square method.Each of these lines will check if the square of the number has been calculated correctly and print the corresponding error message if it's incorrect.

AssertEquals statement and AssertionFailedError

The assertEquals statement is employed to check if a specific condition. Additionally, it accepts an optional string argument that allows you to provide a custom error message if desired.

This assertion statement belongs to the widely used JUnit testing framework, which means you need to add it to your project.

It has different versions (overloads) but in the example of the previous section we used the following:

public static void assertEquals(int expected, int actual, String message) {
    AssertEquals.assertEquals(expected, actual, message);
}

If the condition evaluates to false, it raises an AssertionFailedError. Assume we have the following test case:

@Test
public void testSquare() {
    assertEquals(20, square(5), "Incorrect result");
} 

Note that you need to mark each test with the @Test annotation in JUnit

As the square of 5 is 25, the program will display such a message:

Screenshot showing a failed unit test in a programming environment.

This error message helps developers identify which assertion did not produce the expected output. It is important for debugging, as it helps you verify the specific scenarios in which your code functions as intended.

Generating mock data

Another option to utilize ChatGPT is creating mock data for testing purposes so your tests don’t affect your real application data. It's commonly employed in testing to replicate various scenarios and cases. For instance, if you're evaluating a method that handles user profiles, ChatGPT can generate diverse mock user profiles for you to test with.

Assume we have such a method processes profiles:

public String processUserProfile(User user) {
    return user.getFirstName() + " " + user.getLastName();
}

You can request ChatGPT to generate mock data for testing this method. Here's an example of how you might phrase your request:

Please generate mock data for testing the processUserProfile() method

Putting it in Claude AI yields the following output:

AI Advisor's avatar
Go ahead and try sending a question. You can try different models.
Please generate mock data for testing the processUserProfile() method: public String processUserProfile(User user) { return user.getFirstname() + " " + user.getLastName(); }

Conclusion

In conclusion, using ChatGPT to automate unit test creation can make a developer's life much easier. It speeds up the process, reduces the chances of errors, and helps generate test cases quickly. By giving ChatGPT a few examples, it can learn the pattern and handle much of the repetitive work.

As a next step, try completing the tasks in the practice section to test the knowledge you have gained in this topic.

How did you like the theory?
Report a typo