# 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
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155652753.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155652753.png)

### Spring Boot Annotations
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155665181.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155665181.png)
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155673512.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155673512.png)
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155686718.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155686718.png)
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155707441.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155707441.png)
[![](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/scaled-1680-/image-1650155727685.png)](https://bookstack.mitchellhenschel.com/uploads/images/gallery/2022-04/image-1650155727685.png)