Journal

Testing File Upload and Download Endpoints in Spring Boot
File upload and download endpoints sit quietly in most Spring Boot services until something goes wrong in production. A misplaced Content-Type header, a…
Writing Readable BDD Tests with Cucumber and Java
Behaviour-driven development has reshaped how Java teams think about test automation. Rather than treating tests as private developer artefacts, BDD encourages…
Parallelizing JUnit 5 Tests for Faster Execution
Software teams across Sydney, Melbourne, and Brisbane often juggle two competing pressures. Production codebases keep expanding, and the unit and integration…
Testing Kafka producers and consumers in Java with Embedded Kafka
Apache Kafka sits at the heart of many Australian event-driven platforms, from the real-time price feeds at ASX to the transaction pipelines powering…
How to mock static methods in Java with Mockito and PowerMock
Static methods sit quietly inside almost every legacy codebase, and they often become the first obstacle for developers trying to bring a project under proper…
Contract Testing With Spring Cloud Contract for Microservices
A microservices architecture splits what used to be a single deployable into dozens of independent services. Each one ships on its own schedule, behind its own…
Secrets of flaky test detection and fixing in CI pipelines
A flaky test passes and fails without a relevant code change. That behaviour makes a CI pipeline difficult to trust: a green build can hide a defect, while a…
Performance testing REST endpoints with Gatling and Scala
A REST API can appear healthy in functional tests and still struggle when real users arrive concurrently. Response times rise, connection pools fill,…
Strategies for Generating Realistic Test Data with Instancio
Good test data sits between two extremes. Values that are completely random rarely expose meaningful defects, while hand-written fixtures become repetitive,…
Database Testing With Testcontainers in Java Microservices
A Java microservice can pass every unit test and still fail when it meets a real database. SQL dialect differences, transaction boundaries, migration ordering,…