spring boot集成测试:autowired成员有null成员

时间:2017-04-19 12:19:43

标签: spring-boot integration-testing spock

对于使用spring boot 1.5.2.RELEASE构建的spring-data-rest webapp,我有以下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的createDemoData方法中,demoData.myMap是null而不是空Map。当我将它初始化为DemoData类中的空映射时,为什么会这样呢?我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

我不完全理解为什么我看到DemoData成员myMap为null但我已经确定了解决问题的方法。

修复方法是使DemoData成员myMap受保护/私有,并添加一个访问器方法来访问它。这解决了这个问题。我猜这可能是由于春天使用CGLIB代理以及如何定义切入点。也许它是春天的一个可以修复的错误?

使用变通方法,我的测试代码如下所示:

    @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() {...}
..

。     }