Mengejek RestTemplate pada Musim Bunga

1. Pengenalan

Sering kali, kami menghadapi aplikasi yang melakukan permintaan web. Ketika menguji tingkah laku ini, kami mempunyai beberapa pilihan dengan aplikasi Spring.

Dalam tutorial ringkas ini, kita akan melihat beberapa cara mengejek panggilan seperti yang dilakukan hanya melalui RestTemplate .

Kami akan memulakan ujian dengan Mockito, sebuah perpustakaan ejekan yang popular. Kemudian, kami akan menggunakan Spring Test yang menyediakan mekanisme untuk membuat pelayan tiruan untuk menentukan interaksi pelayan.

2. Menggunakan Mockito

Kita dapat menggunakan Mockito untuk mengejek RestTemplate sama sekali. Dengan pendekatan ini, menguji perkhidmatan kami semudah ujian lain yang mengejek.

Mari kita anggap, kita mempunyai kelas EmployeeService yang ringkas , yang mengambil maklumat pekerja melalui HTTP:

@Service public class EmployeeService { @Autowired private RestTemplate restTemplate; public Employee getEmployee(String id) { ResponseEntity resp = restTemplate.getForEntity("//localhost:8080/employee/" + id, Employee.class); return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null; } } 

Mari laksanakan ujian kami untuk kod sebelumnya:

@RunWith(MockitoJUnitRunner.class) public class EmployeeServiceTest { @Mock private RestTemplate restTemplate; @InjectMocks private EmployeeService empService = new EmployeeService(); @Test public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() { Employee emp = new Employee(“E001”, "Eric Simmons"); Mockito .when(restTemplate.getForEntity( “//localhost:8080/employee/E001”, Employee.class)) .thenReturn(new ResponseEntity(emp, HttpStatus.OK)); Employee employee = empService.getEmployee(id); Assert.assertEquals(emp, employee); } }

Di kelas ujian JUnit di atas, kami pertama kali meminta Mockito untuk membuat contoh RestTemplate palsu menggunakan anotasi @Mock .

Kemudian, kami telah memberi penjelasan mengenai contoh EmployeeService dengan @InjectMocks untuk memasukkan contoh dummy ke dalamnya.

Akhirnya, dalam kaedah ujian, kami telah menentukan tingkah laku olok-olok kami menggunakan sokongan Mockito ketika / kemudian menyokong.

3. Menggunakan Ujian Musim Semi

TheModul Spring Test merangkumi pelayan tiruan bernama MockRestServiceServer. Dengan pendekatan ini, kami mengkonfigurasi pelayan untuk mengembalikan objek tertentu ketika permintaan tertentu dikirim melalui contoh RestTemplate kami . Akhirnya, kita dapat mengesahkan () pada contoh pelayan itu sama ada semua jangkaan telah dipenuhi atau tidak.

MockRestServiceServer sebenarnya berfungsi dengan memintas panggilan API HTTP menggunakan MockClientHttpRequestFactory . Berdasarkan konfigurasi kami, ia membuat senarai permintaan yang diharapkan dan respons yang sesuai. Apabila contoh RestTemplate memanggil API, ia mencari permintaan dalam senarai harapannya dan mengembalikan respons yang sesuai.

Oleh itu, ia menghilangkan keperluan menjalankan pelayan HTTP di port lain untuk menghantar respons palsu.

Mari buat ujian mudah untuk contoh getEm Employee () yang sama menggunakan MockRestServiceServer :

@RunWith(SpringRunner.class) @ContextConfiguration(classes = SpringTestConfig.class) public class EmployeeServiceMockRestServiceServerUnitTest { @Autowired private EmployeeService empService; @Autowired private RestTemplate restTemplate; private MockRestServiceServer mockServer; private ObjectMapper mapper = new ObjectMapper(); @Before public void init() { mockServer = MockRestServiceServer.createServer(restTemplate); } @Test public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject()() { Employee emp = new Employee("E001", "Eric Simmons"); mockServer.expect(ExpectedCount.once(), requestTo(new URI("//localhost:8080/employee/E001"))) .andExpect(method(HttpMethod.GET)) .andRespond(withStatus(HttpStatus.OK) .contentType(MediaType.APPLICATION_JSON) .body(mapper.writeValueAsString(emp)) ); Employee employee = empService.getEmployee(id); mockServer.verify(); Assert.assertEquals(emp, employee); } } 

Dalam coretan sebelumnya, kami menggunakan kaedah statik dari dalam MockRestRequestMatchers dan MockRestResponseCreators untuk menentukan jangkaan dan tindak balas untuk panggilan REST dengan cara yang jelas dan mudah dibaca:

import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; import static org.springframework.test.web.client.response.MockRestResponseCreators.*;

Kita harus ingat bahawa RestTemplate di kelas ujian mestilah contoh yang sama yang digunakan di kelas EmployeeService . Untuk memastikannya, kami telah menentukan kacang RestTemplate pada konfigurasi musim bunga dan memasang secara automatik contoh dalam ujian dan pelaksanaan:

@Bean public RestTemplate restTemplate() { return new RestTemplate(); }

Menggunakan MockRestServiceServer sangat berguna semasa kita menulis ujian integrasi kita dan hanya perlu mengejek panggilan HTTP luaran.

4. Kesimpulan

Dalam artikel ringkas ini, kami telah membincangkan beberapa pilihan yang berkesan untuk mengejek panggilan REST API luaran melalui HTTP semasa menulis ujian unit.

Kod sumber untuk artikel di atas boleh didapati di GitHub.