Skip to content

Commit 1648151

Browse files
Register hints for @WithSecurityContext on class level
Issue gh-12215
1 parent 222f8ae commit 1648151

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Diff for: test/src/main/java/org/springframework/security/test/aot/hint/WithSecurityContextTestRuntimeHints.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.security.test.aot.hint;
1818

1919
import java.util.Arrays;
20+
import java.util.stream.Stream;
2021

2122
import org.springframework.aot.hint.MemberCategory;
2223
import org.springframework.aot.hint.RuntimeHints;
@@ -38,13 +39,21 @@ class WithSecurityContextTestRuntimeHints implements TestRuntimeHintsRegistrar {
3839

3940
@Override
4041
public void registerHints(RuntimeHints hints, Class<?> testClass, ClassLoader classLoader) {
41-
Arrays.stream(testClass.getDeclaredMethods())
42-
.map((method) -> MergedAnnotations.from(method, SUPERCLASS).get(WithSecurityContext.class))
42+
Stream.concat(getClassAnnotations(testClass), getMethodAnnotations(testClass))
4343
.filter(MergedAnnotation::isPresent)
4444
.map((withSecurityContext) -> withSecurityContext.getClass("factory"))
4545
.forEach((factory) -> registerDeclaredConstructors(hints, factory));
4646
}
4747

48+
private Stream<MergedAnnotation<WithSecurityContext>> getClassAnnotations(Class<?> testClass) {
49+
return MergedAnnotations.search(SUPERCLASS).from(testClass).stream(WithSecurityContext.class);
50+
}
51+
52+
private Stream<MergedAnnotation<WithSecurityContext>> getMethodAnnotations(Class<?> testClass) {
53+
return Arrays.stream(testClass.getDeclaredMethods())
54+
.map((method) -> MergedAnnotations.from(method, SUPERCLASS).get(WithSecurityContext.class));
55+
}
56+
4857
private void registerDeclaredConstructors(RuntimeHints hints, Class<?> factory) {
4958
hints.reflection().registerType(factory, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
5059
}

Diff for: test/src/test/java/org/springframework/security/test/aot/hint/WithSecurityContextTestRuntimeHintsTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
2929
import org.springframework.security.core.context.SecurityContext;
3030
import org.springframework.security.core.context.SecurityContextHolder;
31+
import org.springframework.security.test.context.showcase.WithMockCustomUser;
32+
import org.springframework.security.test.context.showcase.WithMockCustomUserSecurityContextFactory;
3133
import org.springframework.security.test.context.support.WithAnonymousUser;
3234
import org.springframework.security.test.context.support.WithMockUser;
3335
import org.springframework.security.test.context.support.WithSecurityContext;
@@ -39,6 +41,7 @@
3941
/**
4042
* Tests for {@link WithSecurityContextTestRuntimeHints}.
4143
*/
44+
@WithMockCustomUser
4245
class WithSecurityContextTestRuntimeHintsTests {
4346

4447
private final RuntimeHints hints = new RuntimeHints();
@@ -85,6 +88,12 @@ void withMockTestUserHasHints() {
8588
.withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(this.hints);
8689
}
8790

91+
@Test
92+
void withMockCustomUserOnClassHasHints() {
93+
assertThat(RuntimeHintsPredicates.reflection().onType(WithMockCustomUserSecurityContextFactory.class)
94+
.withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(this.hints);
95+
}
96+
8897
@Retention(RetentionPolicy.RUNTIME)
8998
@WithSecurityContext(factory = WithMockTestUserSecurityContextFactory.class)
9099
@interface WithMockTestUser {

Diff for: test/src/test/java/org/springframework/security/test/context/showcase/WithMockCustomUser.java

+4
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616

1717
package org.springframework.security.test.context.showcase;
1818

19+
import java.lang.annotation.Retention;
20+
import java.lang.annotation.RetentionPolicy;
21+
1922
import org.springframework.security.test.context.support.WithSecurityContext;
2023

2124
/**
2225
* @author Rob Winch
2326
*/
27+
@Retention(RetentionPolicy.RUNTIME)
2428
@WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class)
2529
public @interface WithMockCustomUser {
2630

0 commit comments

Comments
 (0)