2017-08-24 14 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トリックは十分ではない、と私は誰もがこの1で私を助けることができるpowermock

についてあまり知りませんか?

+0

チェックこの1 https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-を与えますfields-or-inner-class – 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

うまくいくはずですが、勿論、 'log'オブジェクトは' execute'が呼ばれるとすぐに置き換えられます。 –

+0

LogFactoryをモックできます。 – want2learn

+0

私はそうではありませんが、あなたは静かな嘲笑でしかありません。それは賢明な選択よりもむしろ欲望の行為です;-)私を間違えないでください。あなたのソリューションは完全に正しいと思います。悪いコード。個人的には、私はロガーがメソッドのどこかでではなく、最初に初期化されていない理由も得られません。 –

関連する問題