Bird
Raised Fist0
JUnittesting~5 mins

@MockBean for Spring mocking in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the @MockBean annotation in Spring testing?

@MockBean creates and injects a mock of a Spring bean into the application context during tests. It replaces the real bean with a mock to isolate the unit under test.

Click to reveal answer
intermediate
How does @MockBean differ from Mockito's @Mock annotation?

@MockBean integrates with Spring's application context and replaces beans there, while @Mock creates a mock object but does not replace Spring beans automatically.

Click to reveal answer
beginner
Where should you place the @MockBean annotation in a Spring Boot test?
<p>You place <code>@MockBean</code> on a field in your test class where you want Spring to inject the mock bean instead of the real one.</p>
Click to reveal answer
beginner
Can @MockBean be used to mock multiple beans in the same test?
<p>Yes, you can declare multiple <code>@MockBean</code> fields in the same test class to mock different beans as needed.</p>
Click to reveal answer
intermediate
What happens if you use @MockBean on a bean that is not present in the Spring context?

Spring will add the mock bean to the context, so it can be used by other beans or the test, even if the original bean was not defined.

Click to reveal answer
What does @MockBean do in a Spring Boot test?
AReplaces a Spring bean with a mock in the application context
BCreates a mock object but does not affect Spring beans
CRuns the real bean without mocking
DDisables Spring context loading
Where do you declare @MockBean in your test code?
AInside the bean class
BOn the main application class
COn a field in the test class
DIn the application.properties file
Which of these is a key benefit of using @MockBean over @Mock?
AIt disables all beans except mocks
BIt runs tests faster by skipping mocks
CIt automatically generates test data
DIt integrates mocks into Spring's application context
Can you use multiple @MockBean annotations in one test class?
AOnly in integration tests
BYes, to mock multiple beans
COnly if beans are of the same type
DNo, only one mock bean per test
What happens if @MockBean is used on a bean not originally in the Spring context?
ASpring adds the mock bean to the context
BTest fails to start
CMock is ignored
DSpring throws an error
Explain how @MockBean helps isolate units in Spring Boot tests.
Think about how mocking helps focus on one part of the code.
You got /3 concepts.
    Describe the difference between @MockBean and @Mock in Spring testing.
    Consider how Spring manages beans versus plain mocks.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using @MockBean in Spring tests?
      easy
      A. To replace a real Spring bean with a mock during testing
      B. To create a new Spring bean in the application context
      C. To run the application without any beans
      D. To automatically generate test data for the application

      Solution

      1. Step 1: Understand the role of @MockBean

        @MockBean is used to replace a real Spring bean with a mock version during tests to isolate the tested component.
      2. Step 2: Compare options with the purpose

        Only To replace a real Spring bean with a mock during testing correctly describes this purpose. Other options describe unrelated behaviors.
      3. Final Answer:

        To replace a real Spring bean with a mock during testing -> Option A
      4. Quick Check:

        @MockBean replaces beans = A [OK]
      Hint: Remember: @MockBean swaps real beans with mocks [OK]
      Common Mistakes:
      • Thinking @MockBean creates new beans instead of replacing
      • Confusing @MockBean with test data generation
      • Assuming @MockBean disables all beans
      2. Which of the following is the correct way to declare a mock bean in a Spring test class?
      easy
      A. @Mock private MyService myService;
      B. @InjectMocks private MyService myService;
      C. @Autowired private MyService myService;
      D. @MockBean private MyService myService;

      Solution

      1. Step 1: Identify the correct annotation for Spring mock beans

        @MockBean is the Spring Boot test annotation to create mock beans in the application context.
      2. Step 2: Check the options

        @MockBean private MyService myService; uses @MockBean correctly. Options A and D are Mockito annotations but not for Spring context replacement. @Autowired private MyService myService; is for injecting real beans.
      3. Final Answer:

        @MockBean private MyService myService; -> Option D
      4. Quick Check:

        @MockBean syntax = B [OK]
      Hint: Use @MockBean for Spring context mocks, not @Mock or @InjectMocks [OK]
      Common Mistakes:
      • Using @Mock instead of @MockBean in Spring tests
      • Confusing @Autowired with mocking
      • Using @InjectMocks outside Mockito context
      3. Given the following test code snippet, what will be the output of myService.getData() if myService is annotated with @MockBean and no behavior is defined?
      @MockBean
      private MyService myService;
      
      @Test
      void test() {
          System.out.println(myService.getData());
      }
      medium
      A. Throws NullPointerException
      B. Actual data from MyService implementation
      C. null
      D. Empty string

      Solution

      1. Step 1: Understand default behavior of @MockBean mocks

        @MockBean creates a Mockito mock. By default, methods return null for objects unless stubbed.
      2. Step 2: Analyze the code snippet

        No behavior is defined for getData(), so it returns null by default.
      3. Final Answer:

        null -> Option C
      4. Quick Check:

        Unstubbed mock method returns null = C [OK]
      Hint: Unstubbed mock methods return null by default [OK]
      Common Mistakes:
      • Expecting real method execution instead of mock
      • Assuming default return is empty string or exception
      • Confusing @MockBean with real bean injection
      4. Identify the error in the following Spring test class using @MockBean:
      @SpringBootTest
      public class UserServiceTest {
      
          @MockBean
          private UserRepository userRepository;
      
          @Test
          public void testFindUser() {
              when(userRepository.findById(1L)).thenReturn(Optional.of(new User()));
              // test logic
          }
      }
      medium
      A. Missing @RunWith(SpringRunner.class) or @ExtendWith(SpringExtension.class)
      B. No error, the code is correct
      C. UserRepository should be annotated with @Autowired, not @MockBean
      D. Incorrect use of when() without MockitoAnnotations.initMocks()

      Solution

      1. Step 1: Check Spring test setup requirements

        @SpringBootTest provides the Spring context and necessary extensions (meta-annotated with @ExtendWith(SpringExtension.class)), enabling @MockBean.
      2. Step 2: Analyze the code

        @MockBean is used correctly. Stubbing with when().thenReturn() works without additional Mockito initialization in Spring Boot tests.
      3. Final Answer:

        No error, the code is correct -> Option B
      4. Quick Check:

        @SpringBootTest enables @MockBean = D [OK]
      Hint: @SpringBootTest is sufficient for @MockBean tests [OK]
      Common Mistakes:
      • Thinking @RunWith or @ExtendWith is required with @SpringBootTest
      • Using MockitoAnnotations.initMocks() with @MockBean
      • Annotating mocks with @Autowired
      5. You have a Spring service OrderService that depends on PaymentService. You want to test OrderService without calling the real PaymentService. Which approach correctly uses @MockBean to achieve this?
      @SpringBootTest
      public class OrderServiceTest {
      
          @Autowired
          private OrderService orderService;
      
          // What should be here?
      
          @Test
          public void testPlaceOrder() {
              when(paymentService.processPayment(any())).thenReturn(true);
              boolean result = orderService.placeOrder(new Order());
              assertTrue(result);
          }
      }
      hard
      A. @MockBean private PaymentService paymentService;
      B. @Mock private PaymentService paymentService;
      C. @Autowired private PaymentService paymentService;
      D. No declaration needed; real PaymentService will be used

      Solution

      1. Step 1: Understand the goal

        We want to test OrderService but replace PaymentService with a mock to avoid real calls.
      2. Step 2: Choose the correct annotation

        @MockBean replaces the Spring bean in the context with a mock, so @MockBean private PaymentService paymentService; is correct. @Mock is Mockito-only and won't replace Spring beans. @Autowired injects real bean. No declaration uses real service.
      3. Final Answer:

        @MockBean private PaymentService paymentService; -> Option A
      4. Quick Check:

        Use @MockBean to mock Spring dependencies = D [OK]
      Hint: Use @MockBean to mock Spring dependencies in tests [OK]
      Common Mistakes:
      • Using @Mock instead of @MockBean for Spring beans
      • Injecting real beans instead of mocks
      • Not declaring the mock bean at all
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard