Опитвам се да използвам Wink RestClient, за да направя функционално тестване на крайна точка на услуга Rest. Използвам мокове за тестване на единици, но бих искал да го тествам функционално като потребител на крайна точка.
Разбирам, че някои ще възразят срещу това, че го наричам REST крайна точка, докато използвам базирано на формуляр удостоверяване, но това е текущата архитектура, която имам.
По-голямата част от ресурсите, които искам да тествам, са защитени ресурси и приложението (работещо на Tomcat6) е защитено чрез удостоверяване чрез формуляр. (както във фрагмента web.xml по-долу).
Това, което опитах досега, е да направя първоначално извикване на незащитен ресурс, да получа заглавката set-cookie, която съдържа JSESSIONID, и да използвам този JSESSIONID в заглавката (чрез Resource.cookie()) в следващите заявки, но това не дава плод.
web.xml
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/login.html?failure=true</form-error-page>
</form-login-config>
</login-config>
Моят Wink RestClient код изглежда по-долу. Всички отговори са 200, но две неща, които забелязвам, са, че отговорът от извикването на /j_security_check/ не включва бисквитката jsessionid и извикването на защитения ресурс каза, че имам неуспешно влизане. Полезният товар за извикването на j_security_check беше уловен директно от прихваната предишна успешна заявка на браузъра.
ClientConfig config = new ClientConfig();
config.setBypassHostnameVerification(true);
RestClient restClient = new RestClient(config);
Resource unprotectedResource = restClient.resource( BASE_URL + "/");
unprotectedResource.header( "Accept", "*/*" );
ClientResponse clientResponse = unprotectedResource.get();
String response = clientResponse.getEntity(String.class);
// get jSession ID
String jSessionId = clientResponse.getHeaders().get("set-cookie").get(0);
jSessionId = jSessionId.split(";")[0];
System.out.println(jSessionId);
// create a request to login via j_security_check
Resource loginResource = restClient.resource(BASE_URL + "/j_security_check/");
loginResource.accept("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
loginResource.header("referer", "http://localhost:8080/contextroot/");
loginResource.cookie( jSessionId );
loginResource.header("Connection", "keep-alive");
loginResource.header("Content-Type", "application/x-www-form-urlencoded");
loginResource.header("Content-Length", "41");
ClientResponse loginResponse = loginResource.post("j_username=*****&j_password=*************");
/* the loginResponse, as this point, does not have the jsessionid cookie, my browser client does */
Resource protectedResource = restClient.resource(BASE_URL + "/protected/test/");
systemResource.accept("application/json");
systemResource.cookie( jSessionId );
ClientResponse systemResponse = systemResource.get();
response = clientResponse.getEntity(String.class);
System.out.println(response);
Всякакви мисли или опит с използването на Wink RestClient за упражняване на ресурси, защитени от формуляр, ще бъдат високо оценени. Предполагам, че бих се забавлявал с други рамки, чувал съм за REST-Assured и други, но тъй като приложението използва Wink и RestClient изглежда ми предоставя това, от което се нуждая, реших, че ще се придържам към него.