Sto creando test unitari in un'applicazione Java Spring Boot per una classe di servizio.Test unitario con jUnit e Mockito per chiamate API REST esterne
La classe di servizio effettua una chiamata esterna a un servizio API REST che restituisce una risposta JSON. Sto prendendo in giro questa chiamata usando Mockito. Sto codificando un JSON nella risposta mockserver.
È questa cattiva pratica avere JSON hardcoded nei test di unità? Se la struttura JSON cambia, il test dovrebbe fallire è il mio ragionamento. C'è una migliore, migliore pratica dove farlo?
frammento di esempio di seguito:
Il codice attuale è funzionale, ho appena modificato questo frammento per brevità per ottenere l'idea attraverso, in modo da inviare un commento se vedi eventuali errori:
public class UserServiceTest extends TestCase {
private static final String MOCK_URL = "baseUrl";
private static final String DEFAULT_USER_ID = "353";
UserService classUnderTest;
ResponseEntity<Customer> mockResponseEntity;
MockRestServiceServer mockServer;
@Mock
RestTemplate mockRestTemplate;
public void setUp() throws Exception {
super.setUp();
classUnderTest = new UserRestService();
mockRestTemplate = new RestTemplate();
mockServer = MockRestServiceServer.createServer(mockRestTemplate);
ReflectionTestUtils.setField(classUnderTest, "restTemplate",
mockRestTemplate);
ReflectionTestUtils.setField(classUnderTest, "userSvcUrl",
MOCK_URL);
}
public void testGetUserById() throws Exception {
mockServer.expect(requestTo(MOCK_URL + "/Users/" + DEFAULT_USER_ID)).andExpect(method(HttpMethod.GET))
.andRespond(withSuccess(
"{\n" +
" \"UserCredentials\": {\n" +
" \"Password\": \"\",\n" +
" \"PasswordNeedsUpdate\": false,\n" +
" \"Security\": [\n" +
" {\n" +
" \"Answer\": \"\",\n" +
" \"Question\": \"Why did the bicycle fall over?\"\n" +
" }\n" +
" ]\n" +
"}"
, MediaType.APPLICATION_JSON));
Customer customer = classUnderTest.getUserById(DEFAULT_USER_ID);
mockServer.verify();
assertNotNull(customer);
assertEquals(DEFAULT_USER_ID, customer.getId());
}
}
JUnit indica che il metodo di installazione deve essere statico. Dove è definito il metodo withSuccess()? – chrisinmtown