JUnit Exception Testing with Example

In this tutorial, we will learn how to write a JUnit test to test exception handling with an example. 

We gonna use Assertions.assertThrows() method to test exception handling.

Let's first create a Book, BookService, and BookNotFoundException classes, and then we will write JUnit test cases to test exception handling.

Create Book Class

package junit5.bookstore.model;

public class Book {
	
	private String bookId;
	private String title;
	private String publisher;
	
	public Book(String bookId, String title, String publisher) {
		this.bookId = bookId;
		this.title = title;
		this.publisher = publisher;
	}

	public String getBookId() {
		return bookId;
	}

	public void setBookId(String bookId) {
		this.bookId = bookId;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getPublisher() {
		return publisher;
	}

	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	
}

Create BookNotFoundException Class

package junit5.bookstore.exception;

public class BookNotFoundException extends RuntimeException {
	public BookNotFoundException(String message) {
		super(message);
	}
}

Create BookService Class

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import junit5.bookstore.exception.BookNotFoundException;
import junit5.bookstore.model.Book;

public class BookService {
	
	private List<Book> listOfBooks = new ArrayList<>();
	
	public void addBook(Book book) {
		listOfBooks.add(book);
	}	
	
	public List<Book> books(){
		return Collections.unmodifiableList(listOfBooks);
	}
	
	public Book getBookById(String bookId) {
		for(Book book : listOfBooks) {
			if(bookId.equals(book.getBookId())) {
				return book;
			}
		}
		return null;
	}
	
	public String[] getBookIdsByPublisher(String publisher) {
		List<String> bookIds = new ArrayList<>();
		for(Book book : listOfBooks) {
			if(publisher.equals(book.getPublisher())) {
				bookIds.add(book.getBookId());
			}
		}
		return bookIds.toArray(new String[bookIds.size()]);
	}
	
	public List<String> getBookTitlesByPublisher(String publisher) {
		List<String> bookTitles = new ArrayList<>();
		for(Book book : listOfBooks) {
			if(publisher.equals(book.getPublisher())) {
				bookTitles.add(book.getTitle());
			}
		}
		return bookTitles;
	}

	public Book getBookByTitle(String title) {
		for(Book book : listOfBooks) {
			if(title.equals(book.getTitle())) {
				return book;
			}
		}
		throw new BookNotFoundException("Book not found in Bookstore!");
	}
}

Write JUnit test to use assertTrue() method

The below Java program demonstrates the usage of all overloaded assertThrows() static methods:

package junit5.exception;

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

import org.junit.jupiter.api.Test;

import junit5.bookstore.exception.BookNotFoundException;
import junit5.bookstore.model.Book;
import junit5.bookstore.service.BookService;

public class AssertThrowsDemo {

	@Test
	public void assertThrowsWithNoMessage() {
		BookService bookService = new BookService();

		Book headFirstJavaBook = new Book("1", "Head First Java", "Wrox");
		Book headFirstDesignPatternBook = new Book("2", "Head First Design Pattern", "Packt");

		bookService.addBook(headFirstJavaBook);
		bookService.addBook(headFirstDesignPatternBook);

		BookNotFoundException bookNotFoundException = assertThrows(BookNotFoundException.class,
				() -> bookService.getBookByTitle("Head First Spring"));

		assertEquals("Book not found in Bookstore!", bookNotFoundException.getMessage());
	}

	@Test
	public void assertThrowsWithMessage() {
		BookService bookService = new BookService();

		Book headFirstJavaBook = new Book("1", "Head First Java", "Wrox");
		Book headFirstDesignPatternBook = new Book("2", "Head First Design Pattern", "Packt");

		bookService.addBook(headFirstJavaBook);
		bookService.addBook(headFirstDesignPatternBook);

		assertThrows(BookNotFoundException.class,
				() -> bookService.getBookByTitle("Head First Spring"),
				"Different exception thrown!");

	}

	@Test
	public void assertThrowsWithMessageSupplier() {
		BookService bookService = new BookService();

		Book headFirstJavaBook = new Book("1", "Head First Java", "Wrox");
		Book headFirstDesignPatternBook = new Book("2", "Head First Design Pattern", "Packt");

		bookService.addBook(headFirstJavaBook);
		bookService.addBook(headFirstDesignPatternBook);

		assertThrows(BookNotFoundException.class,
				() -> bookService.getBookByTitle("Head First Spring"),
				() -> "Different exception thrown!");

	}

}

Run JUnit test Class

Run the JUnit test class to execute all the JUnit test cases and here is the output:


Comments