2017-08-24 255 views
0

我必須在類中測試一個方法。但是這個類本身有一些內部屬性和方法被繼承和保護。JUnit,Mockito和Powermock訪問受保護的本地方法

如果事實上,我有什麼是:

public class MyActionTest { 
    @Test 
    public void goToSearchBaseTest() { 
     MyAction myAction = new MyAction(); 
     myAction.search(); 
     assert (true); 
    } 

} 

然後

public class MyAction extends BaseAction{ 

    ... 

    public ActionForward search(){ 

     if(this.getLog().isDebugEnabled()) { 
      this.getLog().debug("init --> search()"); 
     } 
    } 

} 

最後

public class BaseAction{  

    ... 

    protected Log log; 

    ... 

    public ActionForward execute(ActionMapping mapping, ActionForm form, 
      HttpServletRequest request, HttpServletResponse response) 
       throws Exception { 
     ... 

     log = LogFactory.getLog(this.getClass()); 

     ... 
} 

因此,在第一行我的小試遊:試圖訪問記錄器,我不能訪問它(不要把一個模擬日誌記錄器),因爲它的創建方式,在父類中的方式,我無法修改。

我通常JUnit和技巧的Mockito是不夠的,我不知道這麼多關於powermock

任何人可以幫助我嗎?

+0

檢查這一項 https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-字段或內部類 – Treibholz

回答

1

試試看

@RunWith(PowerMockRunner.class) 
@PrepareForTest(LogFactory.class)  
public class MyActionTest { 

    @InjectMocks 
    MyAction myAction ; 
    @Mock 
    Log log 

    public void setUp() throws Exception { 
     PowerMockito.mockStatic(LogFactory.class); 
     PowerMockito.when(LogFactory.getLog(any(BaseAction.class))).thenReturn(log); 


     @Test 
     public void goToSearchBaseTest() { 
      myAction.search(); 
      assert (true); 
     } 

    } 
+0

應該可以工作,但當然,調用'execute'後立即替換模擬的'Log'對象。 –

+0

你可以模擬你的LogFactory。 – want2learn

+0

不是我的,你可以,但只有靜態嘲笑,這更多的是一種絕望的行爲,而不是一個明智的選擇;-)不要誤解我的意思,我認爲你的解決方案聽起來完全正確,其他一切都只是一個問題糟糕的代碼。而且,我個人甚至都不明白爲什麼記錄器不是簡單地在開始時而是在方法中的某處進行初始化... –