2017-09-29 67 views
-1

因此,這裏的情景單元測試 - 我如何從受保護的方法存根布爾值?

public class Report { 

    public void Generate { 
     if (!isValidDate) { 
     return; 
     } 

     //calling other method 
    } 

    protected boolean isValidDate() { 
     boolean isValid = true; 
     //some logic here to change to false 
     return isValid; 
    } 
} 

而在我的測試中,我有這樣的,因爲我想設置的布爾值是真實的。

@InjectMocks 
Report report; 

@Before 
public void setUp() throws Exception { 
    Whitebox.setInternalState(report, "isValidParameters", true); 
} 

@Test 
public void testReport() throws Exception { 
    //test logic to be added here 
} 

然後我得到了RuntimeException:無法設置私人領域的內部狀態。有人可以幫助我如何在這裏爲我的測試設置受保護方法的布爾值嗎? TIA

回答

0

如果你想學習編寫單元測試,你可以做的最好的事情之一是停止使用Powermockito

您想要通過它自己測試的受保護方法表示您的類可能有太多的責任,需要重構。

而不是方法,爲什麼不使用提取對象模式?

public class DateValidator { 
    public boolean isValid(Date date) { 
     //previous logic from protected method goes here 
    } 
} 

然後你就可以通過這個入構造函數類:

public class Report { 

    private final DateValidator dateValidator; 

    public Report(DateValidator dateValidator) { 
     this.dateValidator = dateValidator; 
    } 
} 

現在您的測試可以是這樣的:

@Mock DateValidator mockDateValidator; 

//system under test 
Report report; 

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    report = new Report(mockDateValidator); 
} 

@Test 
public void test() throws Exception { 
    when(mockDateValidator.isValid()).thenReturn(true); 

    //your test here 
} 

用普通的Mockito堅持是一個很好的學科,將教你良好的面向對象操作。 Mocktio文檔對於解釋這一點非常有用,您可以通過閱讀它獲益良多。