Thursday, 1 June 2023

Micronaut rest: test the hello world application

This is continution to my previous post. In this post, I am going to explain how to test the rest api.

 

API details are given below:

 

url: /welcome

method: GET

expectedMessage: Welcome to Micronaut app!!!!

 

Following snippet test the rest api /welcome.

@MicronautTest
public class WelcomeControllerTest {
	@Inject
	EmbeddedServer embeddedServer;

	@Inject
	@Client("/")
	HttpClient httpClient;

	@Test
	void testHelloWorldResponse() {
		String response = httpClient.toBlocking().retrieve(HttpRequest.GET("/welcome"));
		assertEquals("Welcome to Micronaut app!!!!", response);
	}
}

 

a. @MicronautTest can be applied to any JUnit 5 test to make it a Micronaut test.

b. EmbeddedServer is a general abstraction to manage the lifecycle of any server implementation within a running Micronaut application. Embedded server runs on a randomly available port.

c. HttpClient used to make the calls and the retrieve method returns the response of the controller as a String.

 

Find the below working application.

 

Step 1: Create new maven project ‘micronaut-rest-hello-world-test’.

 

Step 2: Update pom.xml with maven dependencies.

 

pom.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sample.app</groupId>
	<artifactId>micronaut-rest-hello-world-test</artifactId>
	<version>0.1</version>
	<packaging>jar</packaging>

	<parent>
		<groupId>io.micronaut</groupId>
		<artifactId>micronaut-parent</artifactId>
		<version>3.7.3</version>
	</parent>

	<properties>
		<packaging>jar</packaging>
		<jdk.version>11</jdk.version>
		<release.version>11</release.version>
		<micronaut.version>3.7.3</micronaut.version>
		<micronaut.runtime>netty</micronaut.runtime>
		<exec.mainClass>com.sample.app.App</exec.mainClass>
	</properties>

	<repositories>
		<repository>
			<id>central</id>
			<url>https://repo.maven.apache.org/maven2</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>io.micronaut</groupId>
			<artifactId>micronaut-inject</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>io.micronaut</groupId>
			<artifactId>micronaut-validation</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>io.micronaut</groupId>
			<artifactId>micronaut-http-client</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>io.micronaut</groupId>
			<artifactId>micronaut-http-server-netty</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>io.micronaut</groupId>
			<artifactId>micronaut-jackson-databind</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>jakarta.annotation</groupId>
			<artifactId>jakarta.annotation-api</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>io.micronaut.test</groupId>
			<artifactId>micronaut-test-junit5</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-api</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-engine</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>io.micronaut.build</groupId>
				<artifactId>micronaut-maven-plugin</artifactId>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<!-- Uncomment to enable incremental compilation -->
					<!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->

					<annotationProcessorPaths
						combine.children="append">
						<path>
							<groupId>io.micronaut</groupId>
							<artifactId>micronaut-http-validation</artifactId>
							<version>${micronaut.version}</version>
						</path>
					</annotationProcessorPaths>

				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

Step 3: Define WelcomeController class.

 

WelcomeController.java
package com.sample.app.controller;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/welcome")
public class WelcomeController {

	@Get(produces = MediaType.TEXT_PLAIN)
	public String index() {
		return "Welcome to Micronaut app!!!!";
	}
}

Step 4: Define main application class.

 

App.java

package com.sample.app;

import io.micronaut.runtime.Micronaut;

public class App {

	public static void main(String[] args) {
		Micronaut.run(App.class);
	}
}

Define WelcomeControllerTest class under src/test/java.

 

WelcomeControllerTest.java

package com.sample.app.controller;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

import io.micronaut.http.HttpRequest;
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.runtime.server.EmbeddedServer;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import jakarta.inject.Inject;

@MicronautTest
public class WelcomeControllerTest {
	@Inject
	EmbeddedServer embeddedServer;

	@Inject
	@Client("/")
	HttpClient httpClient;

	@Test
	void testHelloWorldResponse() {
		String response = httpClient.toBlocking().retrieve(HttpRequest.GET("/welcome"));
		assertEquals("Welcome to Micronaut app!!!!", response);
	}
}

Total project structure looks like below.





How to run the test cases?

Navigate to the folder, where pom.xml is located and execute below command.

 

mvn test

 

You will see test results in the console.

[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.272 s
[INFO] Finished at: 2022-11-22T13:52:51+05:30
[INFO] ------------------------------------------------------------------------

 

You can download this application from this link.


 


 

Previous                                                    Next                                                    Home

No comments:

Post a Comment