@Mock (Mockito) | @MockBean (Spring Boot) | |
|---|---|---|
| Spring context | Không cần | Cần (thay thế bean trong context) |
| Dùng với | Unit test thuần | Slice test / @SpringBootTest |
java
// @Mock — unit test thuần
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock OrderRepository repo;
@InjectMocks OrderService service;
@Test
void placeOrder_savesOrder() {
service.placeOrder(new Order());
verify(repo).save(any(Order.class));
}
}
// @MockBean — slice test, replace bean trong Spring context
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@MockBean OrderService service;
@Autowired MockMvc mvc;
@Test
void createOrder() throws Exception {
when(service.place(any())).thenReturn(new Order(1L));
mvc.perform(post("/orders")...).andExpect(status().isCreated());
}
}Quy tắc: dùng @Mock khi không cần Spring context. Dùng @MockBean khi test phụ thuộc Spring wiring.
@MockBean chậm hơn: làm context cache bị invalidate.
@Mock (Mockito) | @MockBean (Spring Boot) | |
|---|---|---|
| Spring context | Not needed | Required (replaces bean in context) |
| Use with | Pure unit tests | Slice tests / @SpringBootTest |
java
// @Mock — pure unit test
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Mock OrderRepository repo;
@InjectMocks OrderService service;
@Test
void placeOrder_savesOrder() {
service.placeOrder(new Order());
verify(repo).save(any(Order.class));
}
}
// @MockBean — slice test, replaces a bean in the Spring context
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@MockBean OrderService service;
@Autowired MockMvc mvc;
@Test
void createOrder() throws Exception {
when(service.place(any())).thenReturn(new Order(1L));
mvc.perform(post("/orders")...).andExpect(status().isCreated());
}
}Rule: use @Mock when no Spring context is needed. Use @MockBean when the test depends on Spring wiring.
@MockBean is slower: it invalidates the context cache.