Invoking Private Methods of an Abstract Class
我有一个要求,我必须调用抽象类的私有方法。
假设抽象类如下所示: -
1 2 3 4 5 6 7 8
| public abstract class Base {
protected abstract String getName ();
private String getHi (String v ) {
return"Hi" + v ;
}
} |
有些人可以告诉我有没有办法可以调用getHi(可能是通过Reflection或其他方式),以便我可以测试出来? 我正在使用Junit 4.12和Java 8
我已经解决了这个问题,但这里的方法在抽象类中并不是私有的。
我也经历过这个问题,即使这个问题也没有谈到抽象类中的私有方法。
我不是在这里问我们是否应该测试私有方法或者测试私有方法的最佳策略是什么。 网上有很多关于此的资源。 我只是想问一下如何在java中调用抽象类的私有方法。
-
请参阅stackoverflow.com/q/105007/3788176
-
我知道我们是否应该测试私有方法的讨论。实际上我有兴趣知道是否可以从测试代码中调用抽象类的私有方法?
-
请参阅stackoverflow.com/questions/6913325/&,它提供了一些方法。特别是,这个答案链接到关于测试私有方法的JUnit文档。
-
在哪里使用getHi方法?它的一个例子,但是为了测试这里唯一的替代方案是使用非常难看的反射。你可以找到像PowerMock这样可以帮助你的库,但一般来说,使用这样的侵入式代码是错误的。对于现实生活中的私有方法,总有一些形式的公共,受保护或包访问方法,您可以在到达它们之前使用它们。然后,大多数情况下使用模拟框架,如Mockito和JMock结合CDI和IoC。没有反思就没有办法找到你的具体方法!它不使用和私人。
-
你可以,但你不应该。
-
你在单元测试中测试的是你班级的行为。有问题的方法或者修改可以断言的行为,或者不修改行为,因此可以删除。
-
更多关于这个问题的信息
-
我已经更新了关于我想要问什么的问题,以及为什么你分享的两个问题并没有满足我的需要。
-
@Mifeet这不是重复的。另一个问题不是关于抽象类,而另一个问题的答案在这种情况下没有帮助(我和OP有同样的问题)。其他建议似乎主要是关于如何避免需要调用私有方法,这可能是明智的,但它们不是答案。
我能够调用抽象类的私有方法,如下所示: -
假设我有一个扩展Abstract基类的类: -
1 2 3 4 5
| public class Child extends Base {
protected String getName () {
return"Hello World";
}
} |
然后我可以调用如下的私有方法: -
1 2 3 4 5 6 7 8 9
| 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();
} |