Journal

How to Test Email Sending with GreenMail in Java Integration Tests
Email sending often looks simple from an application’s perspective: create a message, connect to SMTP, hand the message to a mail server, and continue. The…
Writing reliable tests for Spring Boot Actuator endpoints
Spring Boot Actuator exposes the operational surface of an application: health checks, metrics, environment details, application information and custom…
Testing Java SSL/TLS Connections with Self-Signed Certificates in Tests
SSL/TLS failures are often discovered late because a test suite uses plain HTTP or silently trusts every certificate. That approach can leave important…
Mock Environment Variables in Java Tests with System Stubs
Environment variables are a convenient boundary between application code and its runtime configuration. They carry values such as database URLs, feature flags,…
Testing Database Migrations with Flyway and Testcontainers
Database migrations are executable changes to the structure and data of an application’s persistence layer. They create tables, add indexes, change…
Using JUnit 5 Extensions for Custom Test Lifecycle Hooks
JUnit 5 extensions provide a clean way to add behaviour around test execution without forcing every test class to inherit from a shared base class. They can…
How to write unit tests for Java Optional and exception handling
Java’s Optional and exception mechanisms are simple at the syntax level, yet they can hide important business rules. A method may return an empty value for a…
Testing JSON processing with Jackson and Gson in Java
JSON sits between many parts of a modern Java system: REST controllers, message brokers, configuration files, payment gateways and browser clients. A test that…
k6 for API performance testing: scripting and metrics that matter
Plenty of Australian engineering teams discover their REST endpoints behave well in the Sydney lab and only stumble once traffic ramps up across regions that…
Testing Custom Spring Boot Auto-Configuration and Starters
A Spring Boot starter can make a library feel effortless: add one dependency, set a property, and the application receives correctly configured beans. That…