Исходя из вашего класса Клиента, мы хотели бы предложить следующие изменения, чтобы сделать его более тестируемым:
// class
public class Client {
/*** restTemplate unique instance for every unique HTTP server. ***/
@Autowired
RestTemplate restTemplate;
public ResponseEntity<String> sendUser() {
String url = "http://localhost:8080/user/add";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
User test = new User();
test.setName("test");
test.setEmail("a@hotmail.com");
test.setScore(205);
HttpEntity<User> request = new HttpEntity<>(test);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
if(response.getStatusCode() == HttpStatus.OK){
System.out.println("user response: OK");
}
return response;
}
}
А затем для выше мы Junit как:
@RunWith(MockitoJUnitRunner.class)
public class ClientTest {
private String RESULT = "Assert result";
@Mock
private RestTemplate restTemplate;
@InjectMocks
private Client client;
/**
* any setting needed before load of test class
*/
@Before
public void setUp() {
// not needed as of now
}
// testing an exception scenario
@Test(expected = RestClientException.class)
public void testSendUserForExceptionScenario() throws RestClientException {
doThrow(RestClientException.class).when(restTemplate)
.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), any(Class.class));
// expect RestClientException
client.sendUser();
}
@Test
public void testSendUserForValidScenario() throws RestClientException {
// creating expected response
User user= new User("name", "mail", 6609);
Gson gson = new Gson();
String json = gson.toJson(user);
doReturn(new ResponseEntity<String>(json, HttpStatus.OK)).when(restTemplate)
.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), any(Class.class));
// expect proper response
ResponseEntity<String> response =
(ResponseEntity<String>) client.sendUser();
assertEquals(this.RESULT, HttpStatus.OK, response.getStatusCode());
}
}
В основном в вашей sendResponse()
функции мы делаем:
// we are getting URL , creating requestHeader
// finally creating HttpEntity<User> request
// and then passing them restTemplate.exchange
// and then restTemplate is doing its job to make a HTPP connection and getresponse...
// and then we are prinnting the response... somestuff
Таким образом, в соответствующем тесте мы должны также проверять только то, что делает функция
так как restTemplate
заботится о соединении, и вы не отменяете работу restTemplate
, поэтому мы не должны ничего делать для того же ...
лучше просто проверить наш код / логику.
Наконец, чтобы убедиться, что импорт выглядит так:
Конечно, импорт будет выглядеть так:
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
Надеюсь, это поможет.