簡體   English   中英

用junit模擬最終課程失敗

[英]mocking final class with junit fail

我正在嘗試使用Powermock在以下情況下編寫junit。 我嘗試編寫示例代碼,而不是復制不允許在此處發布的確切代碼。

 class MainClass{
     First.getC().setStr("abc");
 }

 final class First{
   public static ClassC getC() {
        return c;
    }
 }

class ClassC{
  private String str;
  //getter/setter for str
 }

它總是失敗。 我的junit如下:

@RunWith(SpringJUnit4ClassRunner.class)
public class MainClassTest {
  @Spy MainClass;

   @Mock
   private ClassC classc;

   @Before
   public void setup() {
     MockitoAnnotations.initMocks(this);
     PowerMockito.mockStatic(First.class);
   }
   @Test
   public void myTest(){
    when(First.getC()).thenReturn(classc);
    Mockito.doCallRealMethod().when(classc).setStr(Mockito.any(String.class)) 
 }
}

有關模擬靜態方法所需步驟的詳細說明

您錯過了關鍵

在測試用例的類級別使用@PrepareForTest(ClassThatContainsStaticMethod.class)批注。

除此之外:我認為它仍然行不通,因為第一步說:

在測試用例的類級別使用@RunWith(PowerMockRunner.class)批注。

這將阻止您使用SpringRunner。

因此,我的建議是: 忘記使用需要在測試用例中進行模擬的靜態方法。 請記住,無論如何, 靜態是良好OOP中的異常。 因此,不是在靜態方法中“修復”行為,而是在接口中表示功能。 最壞的情況是,您仍然可以在具有靜態“單例”實例的某些類中實現接口,然后將該實例傳遞給需要使用該接口的代碼。

因為這樣您可以使用普通的Mockito模擬該接口並傳遞模擬!

長話短說:您編寫了很難測試的代碼,迫使您考慮使用PowerMock-這將迫使您放棄Spring測試運行器-這會使您的生活變得困難10倍。 因此,更改代碼以使其易於測試,而無需考慮PowerMock。

暫無
暫無

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

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