What is difference between @SpyBean and @MockBean in Mockito?

A mock (no matter if we talk about ordinary objects or beans) is simply an "empty shell".

That mock object doesn't have any relation to the underlying production code. It is an object that looks like being an object of class X. But none of the methods or fields that X has do "really" exist on that mocked thing.

Whereas a spy wraps around an existing object of your class under test. Meaning: when you create a spy, you can decide if method calls going to the spy should be "intercepted" (then you are using the spy as if it would be a mock); or be "passed through" to the actual object the spy wraps around.

See here for further reading.


really important to note that the two annotations you are referencing come from Spring Boot, not Mockito (even though that spring lib theyre from is based on Mockito)

mixing test frameworks can give confusing and inaccurate results.