[JUnit] ParameterizedTest, MethodSourec로 케이스별 테스트하기

유알·2024년 1월 21일
0
class SecurityConfigTest {

    @Nested
    class RoleHierarchyTest{
        private static final String hierarchyString = """
                ROLE_ADMIN > ROLE_STAFF
                ROLE_ADMIN > plan:delete:all
                ROLE_STAFF > ROLE_USER
                ROLE_STAFF > plan:read:all
                ROLE_USER > place:read:all
                ROLE_USER > plan:update:owned
                """;

        private static RoleHierarchy roleHierarchy;

        @BeforeAll
        static void setUp() {
            RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
            hierarchy.setHierarchy(hierarchyString);
            roleHierarchy = hierarchy;
        }

        static Stream<Arguments> provideRolesAndExpectedPermissions() {
            return Stream.of(
                    Arguments.of("ROLE_USER", new String[]{"place:read:all", "plan:update:owned"}),
                    Arguments.of("ROLE_STAFF", new String[]{"place:read:all", "plan:update:owned", "plan:read:all"}),
                    Arguments.of("ROLE_ADMIN", new String[]{"place:read:all", "plan:update:owned", "plan:read:all", "plan:delete:all"})
            );
        }

        @ParameterizedTest
        @MethodSource("provideRolesAndExpectedPermissions")
        void roleHierarchy(String role, String... expectedPermissions) {
            //given

            //when
            Set<String> permissions = roleHierarchy.getReachableGrantedAuthorities(Set.of(new SimpleGrantedAuthority(role)))
                    .stream()
                    .map(GrantedAuthority::getAuthority)
                    .collect(Collectors.toSet());

            //then
            for (String expectedPermission : expectedPermissions) {
                Assertions.assertTrue(permissions.contains(expectedPermission));
            }
        }

    }

}

@ParameterizedTest@MethodSource를 사용하면, 케이스별로 정의된 테스트를 할 수 있어, 매우 간단하게 테스트를 작성할 수 있다.

특히 여러개의 인자를 전달할 때는 org.junit.jupiter.params.provider.Arguments를 사용하여 여러 인자를 전달 할 수 있다.
특히 org.junit.jupiter.params.provider패키지에 가면, csv라던지 여러가지 방법으로 테스트 인자를 전달할 수 있는 클래스가 모여있다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글