Testing Code Terminology Test Fixture - A fixed state of a set of objects used as a baseline for running tests. There should be a well known and fixed environment in which tests are run so that the results are repeatable. Unit Tests / Unit Testing - Code written to test code uder test Designed to test specific sections of code Ideally code coverage is maybe 70-80% Should be small and fast No external dependencies No databases or spring components Integration Tests - Designed to test behaviors between objecrts and parts of the overall system Much larger scope Can include the Spring Context, databases, and message brokers Much slower than unit tests Functional Tests - Testing a running application Likely deployed in a test env Functional touch points are tested Test Driven Development - Write Tests first, which of course fail, then code to 'fix' it BDD - Specifies that tests of any unit of software should be specified in terms of desired behavior of the unit Often implemented with DSLs to create natural language tests JBehave, Cucumber, Spock Mock - A fake implementation of a class used for testing. Like a test Double. Spy - A partial mock, allowing you to override select methods of a real class. Generally Mocking is more popular than Spying Testing Goals Generally you want the majority of tests to be unit tests. Bringing up the Spring Context makes your test exponentially slower Try to test specific business logic in unit tests Use integration tests to test interactions Think of a pyramid. Base is unit tests, middle is integration, top is functional tests Test Scope Dependencies Using spring-boot-starter-test will load the following: JUnit - the de-facto standard for unit testing Spring Test and Spring Boot Test - Utilites and integration test support for Spring Boot applications AssertJ - fluent assertion library Hamcrest - A library of matcher objects Mockito - A Java mocking framework JSONassert - An assertion library for JSON JSONPath - XPath for JSON JUnit Annotations Spring Boot Annotations