티스토리 뷰

천년만에 포스팅을 한다. 이직 성공해도 ... 포스팅은 놓치지 않을거에요! 라고 생각을 했는데 ..

어느새 나의 소중한 블로그가 잊혀졌다. 그리고 오늘부터 다시 포스팅을 시작했다. 


인수테스트에서 내가 동작하기 원하는 특정 인수테스트만을 자동으로 실행할 수 있는 프로그램을 개발이 필요했다.

요구사항은 간단하게 아래와 같다.


 1. api.v1 패키지에 있는 인수테스트 중, Exhibition이라는 특정 단어가 포함된 인수테스만을 실행시킨다.

 2. 새로운 인수테스트를 작성해도, 자동으로, 동적으로 테스트를 수행할 수 있는 프로그램을 개발한다.

 3. 기존 테스트 코드에 대한 수정을 최소화한다.


리플랙션을 활용하면 쉽게 해결할 수 있는 문제였다. 그러나 프로그래밍 과정에서 문제가 하나 있었다. 인수테스트 실행을 위한 TestRestTemplate 객체가 

인수테스트를 포함한 클래스에 @Autowired 어노테이션을 이용해서 주입이 되었다. 리플래션의 newInstance() 메소드를 통해 동적으로 생성된 객체에는

@Autowird 어노테이션을 통해 주입이 되지 않아 NullPointerException이 계속 발생한다! 또한, 기존에 인수테스트를 포함한 클래스에 대한 수정을 최소화

해야했기 때문에 더욱 더 난해했다. 


그러나 해결했다. 대견하다! 오랜만에 사람 구실을 했구나! 아래 코드가 해결책이다!

핵심은 ReflectionTestUtils 클래스이다. 좀 더 자세한 예제는 다음링크를 통해 확인을 바란다! (https://www.baeldung.com/spring-reflection-test-utils)


      
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void test() throws IllegalAccessException, InstantiationException {
        List> classes = new Reflections("api.v1")
            .getTypesAnnotatedWith(SpringBootTest.class)
            .stream()
            .filter(c -> c.getSimpleName().toLowerCase().contains("exhibition"))
            .filter(c -> !c.getSimpleName().equals(this.getClass().getSimpleName()))
            .filter(c -> !c.getSimpleName().equals("DisplaySpaceExhibitionControllerV1Test"))
            .collect(Collectors.toList());

        for (Class clazz : classes) {
            Object obj = clazz.newInstance();
            ReflectionTestUtils.setField(obj, "restTemplate", restTemplate);
            Arrays.stream(clazz.getDeclaredMethods())
                .filter(m -> m.isAnnotationPresent(Test.class))
                .forEach(m -> {
                    try {
                        ReflectionTestUtils.invokeMethod(obj, m.getName());
                    } catch (Exception e) {
                        log.info("실패 : {}", e.getMessage());
                    }
                });
        }
    }


이제 많이 놀았다. 놀만큼 놀았다. 하지만 더 놀고싶다. 그러나.. 공부를 해야겠지?!

토요일 스터디를 다시 생성해야 겠다! 스터디 모집ing



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함