2016-05-16 114 views
6

我有一個必須調用抽象類的私有方法的需求。調用抽象類的私有方法

比方說抽象類看起來象下面這樣: -

public abstract class Base { 

    protected abstract String getName(); 

    private String getHi(String v) { 
     return "Hi " + v; 
    } 
} 

能有些讓我知道是有辦法,我可以叫getHi(可能是通過Reflection或其他方式),這樣我可以測試它出來嗎?我正在使用Junit 4.12Java 8

我已經經歷了這個question但這裏的方法在抽象類中不是私有的。

我也經歷了這個question即使這個不談抽象類中的私有方法。

我不是在問這裏是否應該測試私有方法,或者測試私有方法的最佳策略是什麼。網上有很多關於這方面的資源。我只是想問我們應該如何在java中調用一個抽象類的私有方法。

+0

見http://stackoverflow.com/q/105007/3788176 –

+1

我知道有關的討論中,我們是否應該測試私有方法還是不行。其實我有興趣知道是否可以從測試代碼中調用抽象類的私有方法? – tuk

+0

請參閱http://stackoverflow.com/questions/6913325/annotation-to-make-a-private-method-public-only-for-test-classes,它提供了一些方法。特別是,[這個答案](http://stackoverflow.com/a/6913775/3788176)鏈接到關於測試私有方法的JUnit文檔。 –

回答

2

我能夠調用一個抽象類的私有方法如下: -

比方說,我有擴展抽象基類的類: -

public class Child extends Base { 
    protected String getName() { 
    return "Hello World"; 
    } 
} 

然後我能夠調用下面的私有方法: -

Child child = new Child(); 
try { 
     Method method = Base.class.getDeclaredMethod("getHi", String.class); 
     method.setAccessible(true); 
     String output = (String) method.invoke(child, "Tuk"); 
     System.out.println(output); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }