日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Mockito模拟自动装配的字段

發布時間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Mockito模拟自动装配的字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

依賴注入是諸如Spring和EJB之類的Control容器反轉的非常強大的功能。 將注入的值封裝到私有字段中總是一個好主意。 但是,自動連線字段的封裝會降低可測試性。

我喜歡Mockito解決此問題以模擬自動裝配字段的方式。 將在示例中進行解釋。 (此博客文章希望您對Mockito語法有點熟悉,但是它具有足夠的自我描述性。)

這是測試模塊的第一個依賴項。 是Spring單例豆。 該類將在測試中被模擬。

@Repository public class OrderDao {public Order getOrder(int irderId){throw new UnsupportedOperationException("Fail is not mocked!");} }

這是測試類的第二個依賴項。 它也是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;} }

這是正在測試的課程。 它自動裝配上面的依賴項。

@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 –實例化測試對象實例,并嘗試將用@Mock@Spy注釋的字段注入到測試對象的私有字段中
  • @Mock –創建其注釋字段的模擬實例
  • @Spy –為帶注釋的字段實例創建間諜
public class OrderServiceTest {private static final int TEST_ORDER_ID = 15;private static final int TEST_SHOES_PRICE = 2; private static final int TEST_SHIRT_PRICE = 1;@InjectMocksprivate OrderService testingObject;@Spyprivate PriceService priceService;@Mockprivate OrderDao orderDao;@BeforeMethodpublic void initMocks(){MockitoAnnotations.initMocks(this);}@Testpublic void testGetOrderService(){Order order = new Order(Arrays.asList(Item.SHOES, Item.SHIRT));Mockito.when(orderDao.getOrder(TEST_ORDER_ID)).thenReturn(order);//notice different Mockito syntax for spyMockito.doReturn(TEST_SHIRT_PRICE).when(priceService).getActualPrice(Item.SHIRT);Mockito.doReturn(TEST_SHOES_PRICE).when(priceService).getActualPrice(Item.SHOES);//call testing methodint actualOrderPrice = testingObject.getOrderPrice(TEST_ORDER_ID);Assert.assertEquals(TEST_SHIRT_PRICE + TEST_SHOES_PRICE, actualOrderPrice);} }

那么當您運行此測試時會發生什么:

  • 首先,TestNG框架使用@BeforeMethod批注并調用initMocks方法
  • 此方法調用特殊的Mockito調用( MockitoAnnotations.initMocks(this) )來初始化帶注釋的字段。 沒有此調用,這些對象將為null 。 這種方法的常見錯誤是忘記了該調用。
  • 當所有測試字段都填充有所需值時,將調用test。
  • 該示例不包括Spring上下文創建,并且Spring的注釋在這里僅作為針對生產代碼使用的示例。 測試本身不包含對Spring的任何依賴關系,并且會忽略其所有注釋。 實際上,可以使用EJB批注代替它,也可以針對普通的(非IoC管理的)私有字段運行它。

    開發人員傾向于將MockitoAnnotations.initMocks(this)調用視為不必要的開銷。 但這實際上非常方便,因為它可以重置測試對象并重新初始化模擬。 您可以使用它為例

    • 當您使用相同的帶注釋實例的各種測試方法來確保各種測試運行不使用相同的記錄行為時
    • 使用重復/參數化測試時。 例如,您可以將此調用包含在測試方法本身中,并接收間諜對象作為測試參數(作為測試用例的一部分)。 結合TestNG @DataProvider功能,此功能非常性感(將在其他博客文章中對此進行解釋)。

    @Spy注釋對象可以通過兩種方式創建

    • 如果存在默認(非參數化)構造函數,則由Mockito框架自動進行
    • 或顯式初始化(??例如,當只有非默認構造函數時)

    @InjectMocks注釋的測試對象也可以顯式初始化。

    • 可以從GitHub下載示例源代碼。

    參考:在http://lkrnac.net/博客上, 使用Mockito模擬來自JCG合作伙伴 Lubos Krnac的自動連線字段 。

    翻譯自: https://www.javacodegeeks.com/2014/02/use-mockito-to-mock-autowired-fields.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的使用Mockito模拟自动装配的字段的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。