Note: see the course notes on arrays for more detailed information about arrays in Java.
JUnit
Classes are the “parts” of an object-oriented program.
Testing makes sure that the parts work correctly.
If the individual classes don’t work correctly, the overall program is probably not going to work correctly. Therefore, it is very important to have a good set of tests for the classes in your program.
JUnit is a unit testing framework for Java programs. To use JUnit, you write test classes. A test class is designed to test one Java class. It contains one or more test methods. Each test method is designed to test one particular feature of the class being tested.
General structure of a JUnit test class
The test class’s fields (member variables) store references to objects (generally, instances of the class being tested). These fields and the objects they point to are called the test fixture.
A test class’s setUp method creates the test fixture objects. This method is called automatically before each test method is called. It must be marked with the @Before annotation.
The test methods call methods on the test fixture objects and check to see that the methods compute the correct result, typically by calling an assertion method. Assertion methods are methods defined by the JUnit framework specifically for checking that calls to methods in classes being tested compute the expected result. Each test method must be marked with the @Test annotation.
Ideally, a test method should focus on one particular method to be tested.
Kinds of JUnit assertion methods:
Most assertions in JUnit test classes will boil down to checking that the return value of a method call is equal to an expected value.
If an assertion is not satisifed, it causes the test method containing the assertion to fail. If all assertions in a test method are satisifed, the test method containing the assertion passes. The goal of testing using JUnit is that all assertions in all test methods should pass.
Eclipse has built-in support for running JUnit tests. To run a JUnit test class within eclipse, right-click on the test class, and choose Run As…→JUnit test. The result will be displayed in the JUnit window:
- Green bar: all of the test methods passed
- Red bar: at least one of the test methods failed
JUnit Example
As an example, let’s consider an improved version of our Point class:
Here’s a very simple JUnit class for testing the Point class. We’ll call the test class PointTest.
This is a very simple example, but it demonstrates the basic idea: for each method in the Point class, we want to have one or more test methods which check whether or not the method behaves correctly using some test input.
Note that there is one method in Point that we didn’t test - the print method. It is actually quite difficult to test methods that write output to System.out.
Java Arrays
Java arrays are a lot like C/C++ arrays.
The main difference is that Java arrays are objects, in the same way that instances of classes are objects. As with all objects in Java, instances of array are accessed through references. Thus, an array variable in Java is not the actual array: it is just a memory location in which a reference to an array may be stored.
Consider the following code:
Line (1) creates a variable called heaps whose type is int[], meaning “array of int”. Because array variables store a reference to an array, and not the array itself, the variable does not point to any actual array yet.
Line (2) creates an array object for storing 6 int elements, and assigns the reference to the newly-created array to the variable heaps. Here’s a picture:
Like arrays in C and C++, Java arrays are indexed starting at 0. So, the valid range of indices for this array is 0..5.
Because arrays are accessed through references, it is possible to have two array variables storing references to the same array object. For example:
As a picture, here’s what’s happening at point (1):
Here’s what’s happening at point (2):
Array length
One nice feature of Java that is not present in C and C++ is the ability to determine the exact number of elements in an array. If arr is an array, then
is the number of elements in the array.
For example, the following static method will compute the sum of the elements of any array of int values:
Default values
When an array object is created using the new operator, each element of the array is automatically initialized with a default value. The default value is 0 for all numeric element types, and the special null reference for all class and array element types.
Here’s a code snippet that illustrates the default value for an array of int values:
Arrays of references
When an array has a class or array type as its element type, it stores references. In this way, array elements are the same as any other kind of variable.
For example:
Here’s what things look like at point (1):
Summary
- JUnit allows you to test a class by using assertions to check that calling methods on objects belonging to that class work correctly
- Java arrays are really objects that are accessed by references, just like objects that are instances of a class
- The length property of an array indicates how many elements an array object has
- A multidimensional array in Java is really an array of references to arrays
- Array elements are automatically initialized to a default value, which is 0 for numeric types and null for reference types (classes and arrays)