使用Mockito模拟自动装配的字段
依賴注入是諸如Spring和EJB之類的Control容器反轉(zhuǎn)的非常強(qiáng)大的功能。 將注入的值封裝到私有字段中總是一個(gè)好主意。 但是,自動(dòng)連線字段的封裝會(huì)降低可測試性。
我喜歡Mockito解決此問題以模擬自動(dòng)裝配字段的方式。 將在示例中進(jìn)行解釋。 (此博客文章希望您對Mockito語法有點(diǎn)熟悉,但是它具有足夠的自我描述性。)
這是測試模塊的第一個(gè)依賴項(xiàng)。 是Spring單例豆。 該類將在測試中被模擬。
這是測試類的第二個(gè)依賴項(xiàng)。 它也是Spring組件。 該類將在測試中被偵聽(部分嘲笑)。 其方法calculatePriceForOrder將保持不變。 第二種方法將被存根。
@Service public class PriceService {public int getActualPrice(Item item){throw new UnsupportedOperationException("Fail is not mocked!");}public int calculatePriceForOrder(Order order){int orderPrice = 0;for (Item item : order.getItems()){orderPrice += getActualPrice(item);}return orderPrice;} }這是正在測試的課程。 它自動(dòng)裝配上面的依賴項(xiàng)。
@Service public class OrderService {@Autowiredprivate PriceService priceService;@Autowiredprivate OrderDao orderDao;public int getOrderPrice(int orderId){Order order = orderDao.getOrder(orderId);return priceService.calculatePriceForOrder(order);} }最后是測試示例。 它使用字段級別的注釋:
- @InjectMocks –實(shí)例化測試對象實(shí)例,并嘗試將用@Mock或@Spy注釋的字段注入到測試對象的私有字段中
- @Mock –創(chuàng)建其注釋字段的模擬實(shí)例
- @Spy –為帶注釋的字段實(shí)例創(chuàng)建間諜
那么當(dāng)您運(yùn)行此測試時(shí)會(huì)發(fā)生什么:
該示例不包括Spring上下文創(chuàng)建,并且Spring的注釋在這里僅作為針對生產(chǎn)代碼使用的示例。 測試本身不包含對Spring的任何依賴關(guān)系,并且會(huì)忽略其所有注釋。 實(shí)際上,可以使用EJB批注代替它,也可以針對普通的(非IoC管理的)私有字段運(yùn)行它。
開發(fā)人員傾向于將MockitoAnnotations.initMocks(this)調(diào)用視為不必要的開銷。 但這實(shí)際上非常方便,因?yàn)樗梢灾刂脺y試對象并重新初始化模擬。 您可以使用它為例
- 當(dāng)您使用相同的帶注釋實(shí)例的各種測試方法來確保各種測試運(yùn)行不使用相同的記錄行為時(shí)
- 使用重復(fù)/參數(shù)化測試時(shí)。 例如,您可以將此調(diào)用包含在測試方法本身中,并接收間諜對象作為測試參數(shù)(作為測試用例的一部分)。 結(jié)合TestNG @DataProvider功能,此功能非常性感(將在其他博客文章中對此進(jìn)行解釋)。
@Spy注釋對象可以通過兩種方式創(chuàng)建
- 如果存在默認(rèn)(非參數(shù)化)構(gòu)造函數(shù),則由Mockito框架自動(dòng)進(jìn)行
- 或顯式初始化(??例如,當(dāng)只有非默認(rèn)構(gòu)造函數(shù)時(shí))
@InjectMocks注釋的測試對象也可以顯式初始化。
- 可以從GitHub下載示例源代碼。
翻譯自: https://www.javacodegeeks.com/2014/02/use-mockito-to-mock-autowired-fields.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用Mockito模拟自动装配的字段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样进入路由器设置界面【图】
- 下一篇: 三星同美国一家电动汽车厂商签订摄像头模组