Câu trả lời:
Thư viện đồng bằng Mockito
import org.mockito.Mock;
...
@Mock
MyService myservice;
và
import org.mockito.Mockito;
...
MyService myservice = Mockito.mock(MyService.class);
đến từ thư viện Mockito và có chức năng tương đương.
Họ cho phép giả định một lớp hoặc một giao diện và ghi lại và xác minh các hành vi trên đó.
Cách sử dụng chú thích ngắn hơn, vì vậy thích hợp hơn và thường được ưa thích hơn.
Lưu ý rằng để bật chú thích Mockito trong khi thực hiện kiểm tra,
MockitoAnnotations.initMocks(this)
phương thức tĩnh phải được gọi.
Để tránh tác dụng phụ giữa các lần kiểm tra, nên thực hiện trước mỗi lần thực hiện kiểm tra:
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
Một cách khác để kích hoạt các chú thích Mockito là chú thích lớp kiểm tra bằng @RunWith
cách chỉ định MockitoJUnitRunner
nhiệm vụ thực hiện nhiệm vụ này và các điều hữu ích khác:
@RunWith(org.mockito.runners.MockitoJUnitRunner.class)
public MyClassTest{...}
Thư viện Spring Boot gói thư viện Mockito
Đây thực sự là một lớp Spring Boot :
import org.springframework.boot.test.mock.mockito.MockBean;
...
@MockBean
MyService myservice;
Các lớp học được bao gồm trong spring-boot-test
thư viện.
Nó cho phép thêm Mockito giả trong một mùa xuân ApplicationContext
.
Nếu một bean, tương thích với lớp khai báo tồn tại trong ngữ cảnh, nó sẽ thay thế nó bằng giả.
Nếu nó không phải là trường hợp, nó thêm mock trong bối cảnh như một hạt đậu.
Tham khảo Javadoc:
Chú thích có thể được sử dụng để thêm các giả vào Spring ApplicationContext.
...
Nếu bất kỳ bean đơn hiện có cùng loại được xác định trong ngữ cảnh sẽ được thay thế bằng giả, nếu không có bean nào được xác định thì một bean mới sẽ được thêm vào.
Khi sử dụng Mockito cổ điển / đơn giản và khi sử dụng @MockBean
từ Spring Boot?
Các thử nghiệm đơn vị được thiết kế để kiểm tra một thành phần tách biệt với các thành phần khác và các thử nghiệm đơn vị cũng có một yêu cầu: càng nhanh càng tốt về thời gian thực hiện vì các thử nghiệm này có thể được thực hiện mỗi ngày hàng chục lần trên các máy của nhà phát triển.
Do đó, đây là một hướng dẫn đơn giản:
Khi bạn viết một bài kiểm tra không cần bất kỳ sự phụ thuộc nào từ bộ chứa Spring Boot, Mockito cổ điển / đơn giản là cách để làm theo: nó nhanh và ủng hộ sự cô lập của thành phần được kiểm tra.
Nếu thử nghiệm của bạn cần dựa vào bộ chứa Spring Boot và bạn cũng muốn thêm hoặc giả lập một trong những hạt chứa container: @MockBean
từ Spring Boot là cách.
Cách sử dụng điển hình của Spring Boot @MockBean
Khi chúng ta viết một lớp kiểm tra có chú thích @WebMvcTest
(lát kiểm tra web).
Tài liệu Spring Boot tóm tắt rất tốt:
Thường
@WebMvcTest
sẽ được giới hạn trong một bộ điều khiển duy nhất và được sử dụng kết hợp với@MockBean
để cung cấp các triển khai giả cho các cộng tác viên cần thiết.
Đây là một ví dụ :
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@RunWith(SpringRunner.class)
@WebMvcTest(FooController.class)
public class FooControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private FooService fooServiceMock;
@Test
public void testExample() throws Exception {
Foo mockedFoo = new Foo("one", "two");
Mockito.when(fooServiceMock.get(1))
.thenReturn(mockedFoo);
mvc.perform(get("foos/1")
.accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andExpect(content().string("one two"));
}
}
@MockBean
sẽ thay thế bean trong ngữ cảnh ứng dụng nếu một bean khai báo cùng loại đã được xác định trong cấu hình Spring của bạn. Và phép tiêm được thực hiện trong lớp nơi bạn khai báo @MockBean.
Các cơ chế DI hoạt động theo cách này: bạn đăng ký một đối tượng trong ngữ cảnh DI và sau đó bạn có thể tiêm đối tượng được tham chiếu trong ngữ cảnh Spring trong một lớp cụ thể. Bạn không tiêm một đối tượng trong bối cảnh DI.
Cuối cùng, nó dễ dàng để giải thích. Nếu bạn chỉ nhìn vào javadocs của các chú thích, bạn sẽ thấy sự khác biệt:
@Chế nhạo: (org.mockito.Mock
)
Đánh dấu một lĩnh vực là một giả.
- Cho phép tạo tốc ký giả.
- Giảm thiểu mã tạo giả lặp đi lặp lại.
- Làm cho lớp kiểm tra dễ đọc hơn.
- Làm cho lỗi xác minh dễ đọc hơn vì tên trường được sử dụng để xác định giả.
@MockBean: ( org.springframework.boot.test.mock.mockito.MockBean
)
Chú thích có thể được sử dụng để thêm các giả vào Spring ApplicationContext. Có thể được sử dụng như một chú thích cấp lớp hoặc trên các trường trong một trong hai
@Configuration
lớp hoặc các lớp kiểm tra là@RunWith
SpringRunner.Mocks có thể được đăng ký theo loại hoặc theo tên đậu. Bất kỳ bean đơn hiện có cùng loại được xác định trong ngữ cảnh sẽ được thay thế bằng giả, nếu không có bean nào được xác định, một bean mới sẽ được thêm vào.
Khi
@MockBean
được sử dụng trên một trường, cũng như được đăng ký trong ngữ cảnh ứng dụng, giả cũng sẽ được đưa vào trường.
Mockito.mock ()
Nó chỉ là đại diện của a
@Mock
.
@MockBean
và @Mock
người này sẽ tiêm giả vào Spring ApplicationContext
người kia không?