Правильная заглушка с помощью postForEntity (возврат ResponseEntity) с использованием MockitoJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Правильная заглушка с помощью postForEntity (возврат ResponseEntity) с использованием Mockito

Сообщение Anonymous »

В настоящее время во время тестирования я сталкиваюсь со странным поведением.
Целью было протестировать следующий метод регистрации:

Код: Выделить всё

@RestController
@RequiredArgsConstructor
public class RegisterController {

...

private final String secret = "";
private final String url = "https://www.google.com/recaptcha/api/siteverify";

private final UserService userService;
private final VerificationTokenService tokenService;
private final MailingService mailingService;

...

@PostMapping("/api/auth/register")
public ResponseEntity register(@Valid @RequestBody User user, @RequestParam("token") String token) {

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap map = new LinkedMultiValueMap();

map.add("secret", secret);
map.add("response", token);

// Preparing the request and extracts the response content.
RestTemplate restTemplate = new RestTemplate();

HttpEntity request = new HttpEntity(map, headers);
ResponseEntity response = restTemplate.postForEntity(url, request, CaptchaResponse.class);
CaptchaResponse captchaResponse = response.getBody();

// Response is 200 OK (during test).
System.out.println(response);

// The body contains CaptchaResponse (during test).
System.out.println(response.getBody());

// Always false (during test) even with mocking.
System.out.println(captchaResponse.isSuccess());

// If the captcha failed (always fails during tests).
if (captchaResponse == null || !captchaResponse.isSuccess()) return ResponseEntity.badRequest().build();

...

// Returns the programmed rest user (without the disclosure of the token) as a positive response.
return ResponseEntity.ok(u);
}

...
}
И на данный момент написанный тест был:

Код: Выделить всё

@SpringBootTest
public class RegisterControllerTest {

private MockMvc mock;

@Autowired
private RegisterController registerController;

@Autowired
private ObjectMapper objectMapper;

@MockBean
private UserService userService;

@MockBean
private VerificationTokenService tokenService;

@MockBean
private MailingService mailingService;

@Mock
private RestTemplate rest;

// We don't want to repeat ourselves.
private static User registeringUser;

@BeforeAll
public static void initialize() {
List defaultRoles = new ArrayList();
defaultRoles.add(new Role("USER"));

// Classic user that will attempt to register.
registeringUser = new User("test@example.com", "newenpoi", ".azerty");
registeringUser.setRoles(defaultRoles);
}

@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this);
mock = MockMvcBuilders.standaloneSetup(registerController).build();
}

@Test
@DisplayName("Test registration of a lambda user for production condition with valid captcha.")
public void testRegisterProduction_shouldReturnRestUser_whenCaptchaSuccess() throws Exception {
// Given.
String token = "valid-token";

RestUser expectedRest = new RestUser(registeringUser);
VerificationToken expectedToken = new VerificationToken();

// Simulate captcha response.
CaptchaResponse captchaResponse = new CaptchaResponse();
captchaResponse.setSuccess(true);

ResponseEntity  responseEntity = new ResponseEntity(captchaResponse, HttpStatus.OK);

// When.
when(rest.postForEntity(anyString(), any(HttpEntity.class), eq(CaptchaResponse.class))).thenReturn(responseEntity);

// Then.
mock.perform(post("/api/auth/register").param("token", token).contentType("application/json").content(objectMapper.writeValueAsString(registeringUser))).andExpect(status().isOk());
}
}
Что бы я ни пытался сделать, поле успеха из captchaResponse всегда останется ложным, и я не могу найти то, чего мне не хватает в моем тесте, чтобы передать if (captchaResponse == null || !captchaResponse.isSuccess()) условие!
Это объект CaptchaResponse для справки:

Код: Выделить всё

@RequiredArgsConstructor
@Getter
@Setter
@ToString
public class CaptchaResponse {
private boolean success;
private String challengeTs;
private String hostname;
private String[] errorcodes;
}
Я сделал все возможное, чтобы следовать передовым практикам, также отладка печатает ответ, содержащий CaptchaResponse, но isSuccess() всегда будет ложным во время тестов, а другие поля остаются нулевыми, даже когда я явно задавать значения во время теста (в приведенном выше примере я сохранил только isSuccess для тестирования).
Я просматривал стек здесь и там, но, к сожалению, не смог найти конкретного решения для такого поведения. .
Любая помощь, указывающая мне правильное направление, буду очень признательна!

Подробнее здесь: https://stackoverflow.com/questions/789 ... sing-mocki
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»