簡體   English   中英

在需要測試的類上使用powermock模擬構造函數

[英]Mocking constructor using powermock on the class which needs to be tested

我可以在要測試的類中使用powermock模擬構造函數調用。 當我在@PrepareForTest中添加要測試的類時,此方法有效。 但是,一旦我將類添加到此處,即使測試用例通過,覆蓋率插件中的覆蓋率也將顯示為0。

當我從@PrepareForTest刪除我的類時,當然,其他測試用例的覆蓋率開始顯示,但是必須模擬構造函數調用的測試用例失敗。 不知道該怎么辦。

Class A
{
   MyObject o;
   A(){
     //some other code
     o = new MyObject();
     //some other code
   }

  public void process(){
    //some code

}

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
Class TestA{

  @Test
  public void test1()
  {
    MyObject mocked = Mockito.mock(MyObject.class);
 PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(mocked);
  A a = new A();
  a.process();
  //Assert as per test case

 }

}

在coverage工具中,coverage顯示為0,但是,單元測試通過了,我在調試模式下檢查它是否覆蓋了A類的所有語句。

在coverage工具中,coverage顯示為0,但是,單元測試通過了,我在調試模式下檢查它是否覆蓋了A類的所有語句。

覆蓋率工具依賴於操縱執行的字節碼。

當您模擬static / new時,PowerMock也是如此。

這會很快導致各種問題。 對於JaCoCo,似乎有一種圍繞離線儀表的解決方案。 我還記得在哪里:另一個人回想起那段時間,最后放棄了,因為他也無法使用“離線檢測”來工作。

對於任何其他框架,我不得不重復舊的建議:考慮花費您的時間來學習如何編寫易於測試的代碼。 因為如果您這樣做,則無需使用PowerMock(ito)對其進行測試。

由於構造函數中的new()語句,因此代碼難以測試。 根本不要那樣做。 通過@InjectMocks使用依賴項注入,或者使用僅測試的構造函數來獲取所需的對象。

長話短說:當您編寫自己的新代碼,並且認為需要PowerMock對其進行測試時,您就在做錯事情。

我認為您無需Powermock也可以。 如果您間諜A類並模擬吸氣劑,那么您應該得到相同的結果,並且很可能覆蓋了正確的范圍:

@Test
public void test1(){
    MyObject mocked = Mockito.mock(MyObject.class);
    A spyA = Mockito.spy(new A());
    doReturn(mocked).when(spyA).getMyObject();
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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