I’m implementing integration tests for my Spring Boot application using MockMvc. The problem is that I need to use russian characters in my request/response bodies and they keep changing to unreadable symbols
Here’s my config:
<code>@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = InfoApplicationConfig.class)
@TestPropertySource(properties = {"spring.config.location=classpath:application-it.yml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TerminalControllerIT {
private String baseUrl = "http://localhost";
private final String validTerminalId = "eee00000-0000-0000-0000-000000000000";
private final String invalidTerminalId = "abc00000-0000-0000-0000-000000123456";
private NewTerminalDto testSubject;
private static ObjectMapper objectMapper;
private TerminalRepository terminalRepository;
testSubject = NewTerminalDto.builder().country("Россия").region("Москва").city("Москва")
.street("Ленина").buildingNumber("12A")
.roomNumber("101").terminalCoordinate("55.7558,37.6176")
.postCode("123456").terminalNumber("123")
.isClosed(false).cashDepositWithdrawal(false).moneyTransfer(true).payment(true).nfc(true)
.biometrics(false).encashmentService(true).cashDeposit(true)
baseUrl = baseUrl.concat(":" + port).concat("/api/v1/info-service/terminals");
<code>@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = InfoApplicationConfig.class)
@TestPropertySource(properties = {"spring.config.location=classpath:application-it.yml"})
@AutoConfigureMockMvc
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TerminalControllerIT {
@Autowired
MockMvc mockMvc;
@LocalServerPort
private int port;
private String baseUrl = "http://localhost";
private final String validTerminalId = "eee00000-0000-0000-0000-000000000000";
private final String invalidTerminalId = "abc00000-0000-0000-0000-000000123456";
private NewTerminalDto testSubject;
@Autowired
private static ObjectMapper objectMapper;
@Autowired
private TerminalRepository terminalRepository;
@BeforeEach
public void setUp() {
testSubject = NewTerminalDto.builder().country("Россия").region("Москва").city("Москва")
.street("Ленина").buildingNumber("12A")
.roomNumber("101").terminalCoordinate("55.7558,37.6176")
.postCode("123456").terminalNumber("123")
.isClosed(false).cashDepositWithdrawal(false).moneyTransfer(true).payment(true).nfc(true)
.banknotesPerPack(100)
.biometrics(false).encashmentService(true).cashDeposit(true)
.openingTime("08:00")
.closingTime("18:00")
.build();
baseUrl = baseUrl.concat(":" + port).concat("/api/v1/info-service/terminals");
}
</code>
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = InfoApplicationConfig.class)
@TestPropertySource(properties = {"spring.config.location=classpath:application-it.yml"})
@AutoConfigureMockMvc
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TerminalControllerIT {
@Autowired
MockMvc mockMvc;
@LocalServerPort
private int port;
private String baseUrl = "http://localhost";
private final String validTerminalId = "eee00000-0000-0000-0000-000000000000";
private final String invalidTerminalId = "abc00000-0000-0000-0000-000000123456";
private NewTerminalDto testSubject;
@Autowired
private static ObjectMapper objectMapper;
@Autowired
private TerminalRepository terminalRepository;
@BeforeEach
public void setUp() {
testSubject = NewTerminalDto.builder().country("Россия").region("Москва").city("Москва")
.street("Ленина").buildingNumber("12A")
.roomNumber("101").terminalCoordinate("55.7558,37.6176")
.postCode("123456").terminalNumber("123")
.isClosed(false).cashDepositWithdrawal(false).moneyTransfer(true).payment(true).nfc(true)
.banknotesPerPack(100)
.biometrics(false).encashmentService(true).cashDeposit(true)
.openingTime("08:00")
.closingTime("18:00")
.build();
baseUrl = baseUrl.concat(":" + port).concat("/api/v1/info-service/terminals");
}
Test 1:
@DisplayName("Should return terminal by id")
void getTerminalInfoByIdPositiveTest() throws Exception {
MvcResult result = mockMvc.perform(get(baseUrl + "/" + validTerminalId)
.characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
String jsonResponse = result.getResponse().getContentAsString();
TerminalGetResponse actualResponse = objectMapper.readValue(jsonResponse, TerminalGetResponse.class);
assertNotNull(actualResponse);
assertNotNull(actualResponse.getTerminalNumber());
assertNotNull(actualResponse.getRegion());
assertEquals("ТРМ-001", actualResponse.getTerminalNumber());
assertEquals("Москва", actualResponse.getRegion());
<code>@Test
@DisplayName("Should return terminal by id")
void getTerminalInfoByIdPositiveTest() throws Exception {
MvcResult result = mockMvc.perform(get(baseUrl + "/" + validTerminalId)
.characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();
String jsonResponse = result.getResponse().getContentAsString();
TerminalGetResponse actualResponse = objectMapper.readValue(jsonResponse, TerminalGetResponse.class);
assertNotNull(actualResponse);
assertNotNull(actualResponse.getTerminalNumber());
assertNotNull(actualResponse.getRegion());
assertEquals("ТРМ-001", actualResponse.getTerminalNumber());
assertEquals("Москва", actualResponse.getRegion());
}
</code>
@Test
@DisplayName("Should return terminal by id")
void getTerminalInfoByIdPositiveTest() throws Exception {
MvcResult result = mockMvc.perform(get(baseUrl + "/" + validTerminalId)
.characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();
String jsonResponse = result.getResponse().getContentAsString();
TerminalGetResponse actualResponse = objectMapper.readValue(jsonResponse, TerminalGetResponse.class);
assertNotNull(actualResponse);
assertNotNull(actualResponse.getTerminalNumber());
assertNotNull(actualResponse.getRegion());
assertEquals("ТРМ-001", actualResponse.getTerminalNumber());
assertEquals("Москва", actualResponse.getRegion());
}
Response:
<code>Expected :ТРМ-001
Actual :ТРÐ-001
</code>
Expected :ТРМ-001
Actual :ТРÐ-001
Test 2:
@DisplayName("Adding branch")
void addBranch() throws Exception {
BranchPayload body = BranchStubs.createBranchPayload(0);
mockMvc.perform(post(baseUrl)
.content(objectMapper.writeValueAsBytes(body))
.contentType(MediaType.APPLICATION_JSON_VALUE)
.characterEncoding("UTF-8"))
.andExpect(status().isOk());
BankBranchesModel bankBranchesModel = BankBranchesModel.builder().branchNumber(body.getBranchNumber()).build();
assertNotNull(bankBranchesRepository.findOne(Example.of(bankBranchesModel)).orElse(null));
<code> @Test
@DisplayName("Adding branch")
void addBranch() throws Exception {
BranchPayload body = BranchStubs.createBranchPayload(0);
mockMvc.perform(post(baseUrl)
.content(objectMapper.writeValueAsBytes(body))
.contentType(MediaType.APPLICATION_JSON_VALUE)
.characterEncoding("UTF-8"))
.andExpect(status().isOk());
BankBranchesModel bankBranchesModel = BankBranchesModel.builder().branchNumber(body.getBranchNumber()).build();
assertNotNull(bankBranchesRepository.findOne(Example.of(bankBranchesModel)).orElse(null));
}
</code>
@Test
@DisplayName("Adding branch")
void addBranch() throws Exception {
BranchPayload body = BranchStubs.createBranchPayload(0);
mockMvc.perform(post(baseUrl)
.content(objectMapper.writeValueAsBytes(body))
.contentType(MediaType.APPLICATION_JSON_VALUE)
.characterEncoding("UTF-8"))
.andExpect(status().isOk());
BankBranchesModel bankBranchesModel = BankBranchesModel.builder().branchNumber(body.getBranchNumber()).build();
assertNotNull(bankBranchesRepository.findOne(Example.of(bankBranchesModel)).orElse(null));
}
Result:
<code>MockHttpServletRequest:
Request URI = /api/v1/info-service/branches
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"907"]
Body = {"branchNumber":"8500","country":"??????","region":"?????????? ???????","city":"????????","street":"???????????","buildingNumber":"5","postCode":"117997","branchCoordinate":"55.696225, 37.544539","ramp":true,"phoneNumber":"74955555550","isClosed":false,"openingTime":"00:00","closingTime":"23:55","dayOfWeek":["???????????","???????","?????","???????","???????"],"currencyExchange":true,"foreignCurrency":true,"moneyTransfer":true,"cashWithdrawal":true,"payment":true,"replenishCard":true,"replenishAccount":true,"hasDeposit":true,"hasCredit":true,"consultation":true,"insurance":true,"bik":"044525220","kpp":"773643002","inn":"7707083890","paymentAccount":"40702810562000000000","correspondentAccount":"30101810400000000225","bankNameFull":"?? «FinTech Bank»","okpo":"09610477","ogrn":"1027700057410","swift":"LIBBRUMM007"}
<code>MockHttpServletRequest:
HTTP Method = POST
Request URI = /api/v1/info-service/branches
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"907"]
Body = {"branchNumber":"8500","country":"??????","region":"?????????? ???????","city":"????????","street":"???????????","buildingNumber":"5","postCode":"117997","branchCoordinate":"55.696225, 37.544539","ramp":true,"phoneNumber":"74955555550","isClosed":false,"openingTime":"00:00","closingTime":"23:55","dayOfWeek":["???????????","???????","?????","???????","???????"],"currencyExchange":true,"foreignCurrency":true,"moneyTransfer":true,"cashWithdrawal":true,"payment":true,"replenishCard":true,"replenishAccount":true,"hasDeposit":true,"hasCredit":true,"consultation":true,"insurance":true,"bik":"044525220","kpp":"773643002","inn":"7707083890","paymentAccount":"40702810562000000000","correspondentAccount":"30101810400000000225","bankNameFull":"?? «FinTech Bank»","okpo":"09610477","ogrn":"1027700057410","swift":"LIBBRUMM007"}
Session Attrs = {}
</code>
MockHttpServletRequest:
HTTP Method = POST
Request URI = /api/v1/info-service/branches
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"907"]
Body = {"branchNumber":"8500","country":"??????","region":"?????????? ???????","city":"????????","street":"???????????","buildingNumber":"5","postCode":"117997","branchCoordinate":"55.696225, 37.544539","ramp":true,"phoneNumber":"74955555550","isClosed":false,"openingTime":"00:00","closingTime":"23:55","dayOfWeek":["???????????","???????","?????","???????","???????"],"currencyExchange":true,"foreignCurrency":true,"moneyTransfer":true,"cashWithdrawal":true,"payment":true,"replenishCard":true,"replenishAccount":true,"hasDeposit":true,"hasCredit":true,"consultation":true,"insurance":true,"bik":"044525220","kpp":"773643002","inn":"7707083890","paymentAccount":"40702810562000000000","correspondentAccount":"30101810400000000225","bankNameFull":"?? «FinTech Bank»","okpo":"09610477","ogrn":"1027700057410","swift":"LIBBRUMM007"}
Session Attrs = {}
…
<code>MockHttpServletResponse:
Headers = [Content-Type:"application/json"]
Content type = application/json
Body = {"bankNameFull":"must match "^(?!\s*$)[0-9A-Za-z?-??-? !"#$%&'()*+,\-./:;<=>?@\[\\\]^_{|}~]{1,30}$""}
<code>MockHttpServletResponse:
Status = 400
Error message = null
Headers = [Content-Type:"application/json"]
Content type = application/json
Body = {"bankNameFull":"must match "^(?!\s*$)[0-9A-Za-z?-??-? !"#$%&'()*+,\-./:;<=>?@\[\\\]^_{|}~]{1,30}$""}
Forwarded URL = null
Redirected URL = null
Cookies = []
</code>
MockHttpServletResponse:
Status = 400
Error message = null
Headers = [Content-Type:"application/json"]
Content type = application/json
Body = {"bankNameFull":"must match "^(?!\s*$)[0-9A-Za-z?-??-? !"#$%&'()*+,\-./:;<=>?@\[\\\]^_{|}~]{1,30}$""}
Forwarded URL = null
Redirected URL = null
Cookies = []
Tried to set encoding in test class properties / for objectMapper / for mockMvc – none of that worked for me
Also tried doing it in my migration files which actually doesn;t make sense because characters in request are already messed up