2017-04-19 7 views
0

스프링 부트 1.5.2.RELEASE를 사용하여 작성한 스프링 데이터 기반 웹 애플리케이션에 대한 다음과 같은 spock 통합 테스트가 있습니다.스프링 부트 통합 테스트 : 자동 멤버에 널 멤버가 있음

@SpringBootTest(classes = com.my.server.Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
class MyWebAppSpec extends Specification {  

    @Autowired 
    DemoData demoData; 

    def setup() { 
     createDemoData(); 
    }  

    private void createDemoData() { 
     if (demoData.myMap.keySet().size() == 0) { 
      demoData.load(); 
     }   
    } 
... 
} 

DemoData 클래스는 다음과 같습니다

@Component 
public class DemoData { 

    public Map<String, String> myMap = new HashMap<>(); 

    public void load() {...} 
... 
} 

내가 찾는하고하는 MyWebAppSpec demoData.myMap의 createDemoData 방법에 오히려 빈지도보다 널 것입니다. DemoData 클래스의 빈지도로 초기화 할 때 왜 이렇게됩니까? 어떻게 해결할 수 있습니까?

답변

0

DemoData 멤버 myMap이 null로 표시되는 이유를 완전히 이해하지 못하고 있지만 문제의 수정이 결정되었습니다.

해결 방법은 DemoData 멤버 myMap이/private로 보호되고 액세스하기위한 접근 자 메서드를 추가하는 것입니다. 이렇게하면 문제가 해결됩니다. 나는 이것이 CGLIB 프록시를 사용하는 스프링과 포인트 컷 (pointcut)이 정의 된 방법 때문일 것으로 추측하고있다. 아마도 봄에 수정 될 수있는 버그일까요?

@SpringBootTest(classes = com.my.server.Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
class MyWebAppSpec extends Specification {  

    @Autowired 
    DemoData demoData; 

    def setup() { 
     createDemoData(); 
    }  

    private void createDemoData() { 
     if (demoData.getMyMap().keySet().size() == 0) { //NOTE accessor method used here 
      demoData.load(); 
     }   
    } 
... 
} 

내 DemoData 클래스는 다음과 같습니다 : 다음과 같은 해결 방법으로

내 테스트 코드 보인다

@Component 
public class DemoData { 

    protected Map<String, String> myMap = new HashMap<>(); //NOTE: member is protected now 

    public Map<String, String> getMyMap() { //NOTE: Accessor method added here 
     return myMap; 
    } 


    public void load() {...} 
.. 

. }