Most Java developers have written something like this. Maybe recently. @Test void should_categorize_new_transactions () { final var mockRepository = Mockito . mock ( CategorizedTransactionRepository . class ); final var mockMerchantDirectoryService = Mockito . mock ( MerchantDirectoryService . class ); final var categorizer = new TransactionCategorizer ( mockRepository , mockMerchantDirectoryService ); final var message = createSampleTransactionMessage (); Mockito . when ( mockMerchantDirectoryService . getCategoryForMerchant ( message . mcc ())) . thenReturn ( new MerchantInfo ( message . mcc (), "Transportation" )); Mockito . when ( mockRepository . findByTransactionId ( message . transactionId ())) . thenReturn ( Optional . empty ()); Mockito . when ( mockRepository . save ( Mockito . any ())) . thenAnswer ( invocation -> { var ct = ( CategorizedTransaction ) invocation . getArgument ( 0 ); ct . setId ( 1L ); return ct ; }); final var result = categorizer . categorize ( message ); Assertions .…