[英]Configuring state of mocked object for different scenarios
我有一個DAO和一個服務班。 在服務類CapService中 ,我@Autowired
引用了DAO類CapDAO 。 CapDAO類具有一個int
類型的私有實例字段,該字段的值是使用@Value
注釋從屬性文件中注入的。
class CapDAO {
@Value("${someProperty}")
private int expiryTime;
}
class CapService {
@Autowired
private CapDAO capDAO;
}
CapDAO
類中有一個方法CapDAO
retrieveCap()
,它根據expiryTime
從數據庫中檢索大寫expiryTime
。 該方法從CapService
類中的另一個方法調用。
CapService
類使用從DAO方法返回的列表來創建另一個包裝該列表的對象。 最后,它返回該數據結構。
現在,我正在使用Mockito
框架測試場景。 我有兩種情況。 在這兩種方法中,我都想調用CapService
類的方法,這將為我提供對象。 列表中檢索形式的數據庫,將取決於價值expiryTime
在CapDAO
類。 CapService
類方法返回的對象的內容也將如此。
在測試中,我正在調用Service
類中的方法,並檢查返回的值。 由於DAO正在從屬性文件中讀取expiryTime
,因此兩個測試方案都不能使用相同的配置值來通過。 我必須將兩個配置不同的DAO
實例注入到Service
類中。
因此,我的問題是-有什么方法可以在CapDAO
類中配置expiryTime
,以創建兩個不同的實例,或者可以僅在單個實例中,並根據情況將其注入CapService
中? 不,我沒有關於expiryTime
設置器。 是的,我知道我可以使用反射,但是我想保留它作為我的最后選擇。
簡短答案
反射是最容易的可能性,您可以簡單地使用ReflectionTestUtil 。 注意:如果您有CapDAO實施的接口,則還需要AopUtils
長答案
如果您不想使用反射,則需要分離上下文並進行測試才能完成此工作:
// context1.xml
<context:property-placeholder location="classpath:test1.properties"/>
// context2.xml
<context:property-placeholder location="classpath:test2.properties"/>
然后,您可以在屬性中定義someProperty
和其他值。
我個人將建議反思。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.