Mengolok-olok RestTemplate di Spring

1. Perkenalan

Seringkali, kami menemukan diri kami dengan aplikasi yang melakukan semacam permintaan web. Saat menguji perilaku ini, kami memiliki beberapa opsi dengan aplikasi Spring.

Saya n tutorial ini cepat, kita akan melihat hanya beberapa cara mengejek panggilan tersebut dilakukan hanya melalui RestTemplate .

Kami akan mulai menguji dengan Mockito, perpustakaan mengejek yang populer. Kemudian, kita akan menggunakan Uji Musim Semi yang memberi kita mekanisme untuk membuat server tiruan untuk menentukan interaksi server.

2. Menggunakan Mockito

Kita bisa menggunakan Mockito untuk mengejek RestTemplate sama sekali. Dengan pendekatan ini, pengujian layanan kami akan sesederhana pengujian lain yang melibatkan ejekan.

Mari kita asumsikan, kita memiliki kelas EmployeeService sederhana , yang mengambil detail karyawan 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 terapkan pengujian kita untuk kode 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 pengujian JUnit di atas, pertama-tama kita telah meminta Mockito untuk membuat instance RestTemplate tiruan menggunakan anotasi @Mock .

Kemudian, kami telah memberi anotasi pada instance EmployeeService dengan @InjectMocks untuk memasukkan contoh dummy ke dalamnya.

Terakhir, dalam metode pengujian, kami telah mendefinisikan perilaku tiruan kami menggunakan dukungan when / then Mockito.

3. Menggunakan Uji Pegas

ItuModul Uji Musim Semi menyertakan server tiruan bernama MockRestServiceServer. Dengan pendekatan ini, kami mengkonfigurasi server untuk mengembalikan objek tertentu ketika permintaan tertentu dikirim melalui contoh RestTemplate kami . Akhirnya, kita dapat memverifikasi () pada server itu apakah semua harapan telah terpenuhi atau tidak.

MockRestServiceServer sebenarnya bekerja dengan mencegat panggilan HTTP API menggunakan MockClientHttpRequestFactory . Berdasarkan konfigurasi kami, ini membuat daftar permintaan yang diharapkan dan tanggapan yang sesuai. Saat instance RestTemplate memanggil API, itu mencari permintaan dalam daftar ekspektasinya dan mengembalikan respons yang sesuai.

Dengan demikian, ini menghilangkan kebutuhan menjalankan server HTTP di port lain untuk mengirim tanggapan palsu.

Mari buat pengujian sederhana untuk contoh getEmployee () 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 cuplikan sebelumnya, kami menggunakan metode statis dari dalam MockRestRequestMatchers dan MockRestResponseCreators untuk menentukan ekspektasi dan respons 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 bahwa RestTemplate di kelas pengujian harus contoh yang sama yang digunakan di kelas EmployeeService . Untuk memastikan itu, kami telah mendefinisikan kacang RestTemplate di konfigurasi pegas dan otomatis menghubungkan instance dalam pengujian dan implementasi:

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

Menggunakan MockRestServiceServer sangat berguna saat menulis pengujian integrasi dan hanya perlu meniru panggilan HTTP eksternal.

4. Kesimpulan

Dalam artikel singkat ini, kita telah membahas beberapa opsi efektif untuk meniru panggilan REST API eksternal melalui HTTP saat menulis pengujian unit.

Kode sumber untuk artikel di atas tersedia di GitHub.