Dieser Inhalt ist in der von Ihnen ausgewählten Sprache nicht verfügbar.
Testing your Quarkus applications
Abstract
Chapter 1. Testing your Quarkus applications Link kopierenLink in die Zwischenablage kopiert!
As an application developer, you can use Red Hat build of Quarkus to create microservices-based applications written in Java that run on OpenShift and serverless environments. Applications compiled to native executables have small memory footprints and fast startup times.
This guide shows you how to use Apache Maven to test the Quarkus Getting Started project in JVM mode and how to inject resources into your tests. You will expand the test that you created in Getting started with Quarkus.
You can download a Quarkus Maven project to use in this tutorial from the Quarkus quickstart archive or clone the Quarkus Quickstarts Git repository. The exercise is located in the getting-started-testing directory.
Prerequisites
Have OpenJDK (JDK) 11 installed and the
JAVA_HOMEenvironment variable specify the location of the Java SDK.- Log in the Red Hat Customer Portal to download the Red Hat build of Open JDK from the Software Downloads page.
Have Apache Maven 3.8.1 or higher installed.
- Download Maven from the Apache Maven Project website.
A completed Quarkus Getting Started project.
- To learn how to build the Quarkus Getting Started project, see Getting started with Quarkus.
-
Alternatively, you can download the Quarkus quickstart archive or clone the
Quarkus QuickstartsGit repository. The example is in thegetting-starteddirectory.
Making open source more inclusive Link kopierenLink in die Zwischenablage kopiert!
Red Hat is committed to replacing problematic language in our code, documentation, and web properties. We are beginning with these four terms: master, slave, blacklist, and whitelist. Because of the enormity of this endeavor, these changes will be implemented gradually over several upcoming releases. For more details, see our CTO Chris Wright’s message.
1.1. Verify test dependencies Link kopierenLink in die Zwischenablage kopiert!
For this tutorial, you must have a completed Quarkus Getting Started project and the project pom.xml file must include the quarkus-junit5 and rest-assured dependencies. These dependencies will be present if you completed the Quarkus Getting Started exercise or if you downloaded the completed example.
-
The
quarkus-junit5dependency is required for testing because it provides the@QuarkusTestannotation that controls the testing framework. The
rest-assureddependency is not required but you can use it as a convenient way to test HTTP endpoints.NoteQuarkus provides integration that automatically sets the correct URL, so no configuration is required.
Procedure
-
Open the Getting Started project
pom.xmlfile. Verify that the following dependencies are in the file and add them if necessary:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify that your
pom.xmlfile includes themaven-surefire-plugin. Because this tutorial uses the JUnit 5 framework, the version of themaven-surefire-pluginmust be set because the default version does not support Junit 5:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Set the
java.util.logging.managersystem property to use the correct log manager for test. Verify that the
GreetingResourceTest.javafile contains the following content and add it if necessary:Copy to Clipboard Copied! Toggle word wrap Toggle overflow To run the test, enter the following command:
./mvnw clean verify
./mvnw clean verifyCopy to Clipboard Copied! Toggle word wrap Toggle overflow You can also run the test directly from your IDE.
This test uses HTTP to directly test the REST endpoint. When the test is triggered, the application will start before the test runs.
1.2. Specifying test ports Link kopierenLink in die Zwischenablage kopiert!
By default, Quarkus tests run on port 8081 to avoid conflict with the running application. This allows you to run tests while the application is running in parallel. You can specify a different port for test connections in your application.properties file. You can use separate ports to test unsecured HTTP connections and connections secured with SSL.
Procedure
Set the
quarkus.http.test-portandquarkus.http.test-ssl-portproperty in theapplication.propertiesfile. Replace<port>with the number of the port that you want to use for test connections:quarkus.http.test-port=<port> quarkus.http.test-ssl-port=<port>
quarkus.http.test-port=<port> quarkus.http.test-ssl-port=<port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow You can set the port number to
0to let your operating system assign a random port from the range of available ports on your system.NoteQuarkus provides REST Assured integration that updates the default port used by REST Assured before the tests are run, so no additional configuration is required.
1.3. Setting the response timeout period for HTTP test connections Link kopierenLink in die Zwischenablage kopiert!
When you use REST Assured to test the REST APIs in your application, the default connection and response timeout period is set to 30 seconds. You can change the length of the timeout period for your application.
Procedure
-
Open the
application.propertiesfile in your application project: Set the value of the
quarkus.http.test-timeoutproperty to the length of the duration that you want to set for the timeout period followed by the unit of time that you want to set the duration in:application.properties
quarkus.http.test-timeout=<duration>
quarkus.http.test-timeout=<duration>Copy to Clipboard Copied! Toggle word wrap Toggle overflow For example, to set the duration of the response timeout period to 10 seconds:
application.properties
quarkus.http.test-timeout=10s
quarkus.http.test-timeout=10sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. Injecting a URL into a test Link kopierenLink in die Zwischenablage kopiert!
If you want to use a different client, use the Quarkus @TestHTTPResource annotation to directly inject the URL of the application to be tested into a field on the test class. This field can be of the type String, URL, or URI. You can also provide the test path in this annotation. In this exercise, you will write a simple test that loads static resources.
Procedure
Create the
src/main/resources/META-INF/resources/index.htmlfile with the following content:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
StaticContentTest.javafile with the following content to test thatindex.htmlis being served correctly:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- The
@TestHTTPResourceannotation enables you to directly inject the URL of the Quarkus instance. The value of the annotation is the path component of the URL.
1.5. Injection of CDI beans into tests Link kopierenLink in die Zwischenablage kopiert!
You can perform unit testing and test CDI beans directly. Quarkus enables you to inject CDI beans into your tests through the @Inject annotation. In fact, tests in Quarkus are full CDI beans so you can use the complete CDI functionality.
It is not possible to use injection with native tests.
Procedure
Create the
GreetingServiceTest.javafile with the following content:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- The
GreetingServicebean will be injected into the test.
1.6. Applying interceptors to tests Link kopierenLink in die Zwischenablage kopiert!
Quarkus tests are full CDI beans, so you can apply CDI interceptors as you would normally. For example, if you want a test method to run within the context of a transaction, you can apply the @Transactional annotation to the method. You can also create your own test stereotypes.
Procedure
Add the
quarkus-narayana-jtadependency to yourpom.xmlfile:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-narayana-jta</artifactId> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-narayana-jta</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Make sure the
TransactionalQuarkusTest.javaincludes the following import statements:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
@TransactionalQuarkusTestannotation:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Apply this annotation to a test class where it will behave as if you applied both the
@QuarkusTestand@Transactionalannotations:Copy to Clipboard Copied! Toggle word wrap Toggle overflow This is a simple test that evaluates the greeting service directly without using HTTP.
1.7. Mocking CDI beans Link kopierenLink in die Zwischenablage kopiert!
Quarkus allows you to mock certain CDI beans for specific tests.
You can mock an object using one of the following methods:
-
Override the bean you that you want to mock with a class in the
src/test/javadirectory, and put the@Alternativeand@Priority(1)annotations on the bean. -
Use the
io.quarkus.test.Mockstereotype annotation. The@Mockannotation contains the@Alternative,@Priority(1)and@Dependentannotations.
The following procedure shows how to mock an external service using the @Alternative annotation. Note, that this approach does not work with native image testing because the native image does not include the test alternatives.
Procedure
Create the
ExternalServicein thesrc/main/javadirectory similar to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a class
UsesExternalServicethat usesExternalServicein thesrc/main/javadirectory:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a test in the
src/test/javadirectory similar to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
MockExternalServicein thesrc/test/javathat uses the@Alternativeannotation:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- The
MockExternalServiceis injected wherever theExternalServiceis being used. In this example,MockExternalServicewill be used inUsesExternalService.
NoteYou can use the
@Mockannotation instead of the@Alternative,@Priority(1)and@Dependentannotations.The following example shows how to create
MockExternalServiceclass that uses the@Mockannotation:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Change the asserted string from
"external"to"mock"in the test:Copy to Clipboard Copied! Toggle word wrap Toggle overflow