簡體   English   中英

針對不同情況配置模擬對象的狀態

[英]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類的方法,這將為我提供對象。 列表中檢索形式的數據庫,將取決於價值expiryTimeCapDAO類。 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.

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