[英]How to mock Autowired constructor dependency in groovy spock
我有一個班級,我正在為其編寫 groovy 測試用例。 此類具有構造函數自動裝配並調用另一個方法來初始化字段。:
@Service
public class ServiceA {
private final PrincipalDao principalDao;
@Autowired
public ServiceA(final PrincipalDao principalDao){
this.principalDao=principalDao;
this.serviceMap = getMap();
}
private Map<> getMap() {
final List<ClassA> classAList = principalDao.findAll(); //this line returns null
}
}
這一行final List<ClassA> classAList = principalDao.findAll();
返回null
,我不能像下面這樣在 groovy 中模擬它:
principalDao.findAll() >> list
因為它甚至在我上面的行在 groovy 測試用例中被調用之前就被調用了
沒有看到你的單元測試,很難說出問題是什么,但我有時遇到的一個常見誤解是模擬的時間。
這是一個示例代碼,詳細說明了我的意思。 由於您的問題中缺少部分代碼,因此將假設其中的某些部分,但我確信它解釋了我的觀點,並希望能幫助您找到答案:
服務等級:
@Service
public class ServiceA{
private final PrincipalDao principalDao;
private final Map<String, String> serviceMap;
@Autowired
public ServiceA(final PrincipalDao principalDao){
this.principalDao = principalDao;
this.serviceMap = getMap();
}
private Map<String, String> getMap(){
final HashMap<String, String> stringStringHashMap = new HashMap<String, String>();
stringStringHashMap.put("hello", principalDao.khello());
return stringStringHashMap;
}
public String printServiceMap() {
return serviceMap.get("hello");
}
}
class ServiceATest extends Specification {
def "some test"() {
given:
PrincipalDao principalDao = Mock()
principalDao.khello() >> "khello" // this is the key here. Mocking is happening before instantiation of ServiceA
ServiceA someService = new ServiceA(principalDao)
expect:
"khello" == someService.printServiceMap()
}
}
此單元測試成功通過。 這里的重點是嘲笑的時機。 principalDao.khello() >> "khello"
發生在new ServiceA(principalDao)
。
如果您不需要在每個單元測試中修改 serviceMap,您也可以這樣做,這樣您就不必在每個單元測試中定義它:
class ServiceATest extends Specification {
@Shared
PrincipalDao principalDao = Mock()
ServiceA someService = new ServiceA(principalDao)
def setupSpec() {
principalDao.khello() >> "khello"
}
def "some test"() {
expect:
"khello" == someService.printServiceMap()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.