对于使用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类中的空映射时,为什么会这样呢?我该如何解决这个问题呢?
答案 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() {...}
..
。 }