Navigate to the start directory to begin.

You’ll develop tests that use Arquillian and JUnit to verify the inventory microservice as an endpoint and the functions of the InventoryResource class. The code for the microservices is in the src/main/java/io/openliberty/guides directory.

Create the InventoryArquillianIT test class. src/test/java/it/io/openliberty/guides/inventory/InventoryArquillianIT.java

InventoryArquillianIT.java

Notice that the JUnit Arquillian runner runs the tests instead of the standard JUnit runner. The @RunWith annotation preceding the class tells JUnit to run the tests by using Arquillian.

The method annotated by @Deployment defines the content of the web archive, which is going to be deployed onto the Open Liberty server. The tests are either run on or against the server. The testable = true attribute enables the deployment to run the tests "in container", that is the tests are run on the server.

Notice the arquillian-managed.war name that is used for the web archive. This name is necessary if you don’t want a randomly generated web archive name.

The ShrinkWrap API is used to create the web archive. All of the packages in the inventory service must be added to the web archive; otherwise, the code compiles successfully but fails at runtime when the injection of the InventoryResource class takes place. You can learn about the ShrinkWrap archive configuration in this Arquillian guide.

The @ArquillianResource annotation is used to retrieve the http://localhost:9080/arquillian-managed/ base URL for this web service. The annotation provides the host name, port number and web archive information for this service, so you don’t need to hardcode these values in the test case. The arquillian-managed path in the URL comes from the WAR name you specified when you created the web archive in the @Deployment annotated method. It’s needed when the inventory service communicates with the system service to get the system properties.

The testInventoryEndpoints method is an integration test to test the inventory service endpoints. The @RunAsClient annotation added in this test case indicates that this test case is to be run on the client side. By running the tests on the client side, the tests are run against the managed container. The endpoint test case first calls the http://localhost:9080/{WARNAME}/inventory/systems/{hostname} endpoint with the localhost host name to add its system properties to the inventory. The test verifies that the system property for the local and service JVM match. Then, the test method calls the http://localhost:9080/{WARNAME}/inventory/systems endpoint. The test checks that the inventory has one host and that the host is localhost . The test also verifies that the system property stored in the inventory for the local and service JVM match.

Contexts and Dependency Injection (CDI) is used to inject an instance of the InventoryResource class into this test class. You can learn more about CDI in the Injecting dependencies into microservices guide.

The injected InventoryResource instance is then tested by the testInventoryResourceFunctions method. This test case calls the listContents() method to get all systems that are stored in this inventory and verifies that localhost is the only system being found. Notice the functional test case doesn’t store any system in the inventory, the localhost system is from the endpoint test case that ran before this test case. The @InSequence Arquillian annotation guarantees the test sequence. The sequence is important for the two tests, as the results in the first test impact the second one.