簡體   English   中英

如何在 groovy spock 中模擬 Autowired 構造函數依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM