|  | 
| 16 | 16 | 
 | 
| 17 | 17 | package org.springframework.security.config.annotation.web.configurers; | 
| 18 | 18 | 
 | 
| 19 |  | -import java.io.IOException; | 
|  | 19 | +import java.nio.charset.StandardCharsets; | 
| 20 | 20 | import java.util.List; | 
| 21 | 21 | 
 | 
| 22 | 22 | import org.junit.jupiter.api.Test; | 
|  | 
| 25 | 25 | import org.springframework.beans.factory.annotation.Autowired; | 
| 26 | 26 | import org.springframework.context.annotation.Bean; | 
| 27 | 27 | import org.springframework.context.annotation.Configuration; | 
| 28 |  | -import org.springframework.http.HttpInputMessage; | 
| 29 | 28 | import org.springframework.http.HttpOutputMessage; | 
| 30 |  | -import org.springframework.http.converter.AbstractHttpMessageConverter; | 
| 31 | 29 | import org.springframework.http.converter.HttpMessageConverter; | 
| 32 |  | -import org.springframework.http.converter.HttpMessageNotReadableException; | 
| 33 |  | -import org.springframework.http.converter.HttpMessageNotWritableException; | 
| 34 | 30 | import org.springframework.security.authentication.TestingAuthenticationToken; | 
| 35 | 31 | import org.springframework.security.config.Customizer; | 
| 36 | 32 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; | 
|  | 
| 53 | 49 | import static org.hamcrest.Matchers.containsString; | 
| 54 | 50 | import static org.mockito.ArgumentMatchers.any; | 
| 55 | 51 | import static org.mockito.BDDMockito.given; | 
|  | 52 | +import static org.mockito.BDDMockito.willAnswer; | 
| 56 | 53 | import static org.mockito.Mockito.mock; | 
| 57 | 54 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; | 
| 58 | 55 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; | 
| @@ -153,29 +150,19 @@ public void webauthnWhenConfiguredMessageConverter() throws Exception { | 
| 153 | 150 | 		WebAuthnRelyingPartyOperations rpOperations = mock(WebAuthnRelyingPartyOperations.class); | 
| 154 | 151 | 		ConfigMessageConverter.rpOperations = rpOperations; | 
| 155 | 152 | 		given(rpOperations.createPublicKeyCredentialCreationOptions(any())).willReturn(options); | 
| 156 |  | -		HttpMessageConverter<Object> converter = new AbstractHttpMessageConverter<>() { | 
| 157 |  | -			@Override | 
| 158 |  | -			protected boolean supports(Class<?> clazz) { | 
| 159 |  | -				return true; | 
| 160 |  | -			} | 
| 161 |  | - | 
| 162 |  | -			@Override | 
| 163 |  | -			protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) | 
| 164 |  | -					throws IOException, HttpMessageNotReadableException { | 
| 165 |  | -				return null; | 
| 166 |  | -			} | 
| 167 |  | - | 
| 168 |  | -			@Override | 
| 169 |  | -			protected void writeInternal(Object o, HttpOutputMessage outputMessage) | 
| 170 |  | -					throws IOException, HttpMessageNotWritableException { | 
| 171 |  | -				outputMessage.getBody().write("123".getBytes()); | 
| 172 |  | -			} | 
| 173 |  | -		}; | 
|  | 153 | +		HttpMessageConverter<Object> converter = mock(HttpMessageConverter.class); | 
|  | 154 | +		given(converter.canWrite(any(), any())).willReturn(true); | 
|  | 155 | +		String expectedBody = "123"; | 
|  | 156 | +		willAnswer((args) -> { | 
|  | 157 | +			HttpOutputMessage out = (HttpOutputMessage) args.getArguments()[2]; | 
|  | 158 | +			out.getBody().write(expectedBody.getBytes(StandardCharsets.UTF_8)); | 
|  | 159 | +			return null; | 
|  | 160 | +		}).given(converter).write(any(), any(), any()); | 
| 174 | 161 | 		ConfigMessageConverter.converter = converter; | 
| 175 | 162 | 		this.spring.register(ConfigMessageConverter.class).autowire(); | 
| 176 | 163 | 		this.mvc.perform(post("/webauthn/register/options")) | 
| 177 | 164 | 			.andExpect(status().isOk()) | 
| 178 |  | -			.andExpect(content().string("123")); | 
|  | 165 | +			.andExpect(content().string(expectedBody)); | 
| 179 | 166 | 	} | 
| 180 | 167 | 
 | 
| 181 | 168 | 	@Configuration | 
|  | 
0 commit comments