Java 如何使用Powermock模拟私有枚举?
我有以下课程:Java 如何使用Powermock模拟私有枚举?,java,powermock,Java,Powermock,我有以下课程: public class MyClazz { private static enum MyEnum { INSTANCE; private MyClazzB getMyClazzB() { .... return } final MyClazzB b = getMyClazzB(); } public void m
public class MyClazz
{
private static enum MyEnum
{
INSTANCE;
private MyClazzB getMyClazzB()
{
....
return
}
final MyClazzB b = getMyClazzB();
}
public void methodWhichIWantTest(arguments)
{
//...
//here is logic which I want to test
//...
MyEnum.INSTANCE.b.doSomething();//I want to mock this line.
}
}
我不是MyClazz的作者,我不想改变任何东西。我只想测试方法,它需要测试方法。问题是方法getMyClazzB抛出异常。我不知道如何嘲笑它。
如何嘲笑它?我认为我应该嘲笑MyEnum类,但它是私有的
==编辑===
我想我应该澄清我的问题,因为我得到了一些评论。
我不是MyClazz的作者,但是这个类是我项目的一部分,我可以编辑这个类,但是我想尽量避免编辑。我修复了MyClazz私有方法中的一些错误。我想写一些测试来测试我的补丁。测试私有方法不是一个好的实践,所以我可以为一些调用这个私有方法的公共方法编写集成测试或单元测试。首先,我想写集成测试,但经过研究后,我发现集成测试太复杂,花费了我太多的时间。所以我决定为一些调用这个私有方法的公共方法编写单元测试methodWhichIWantTest是此公共方法。方法getMyClazzB抛出异常,因为它包装javax.naming.InitialContext并查找一些bean(它在wildfly上正常工作,但在简单单元测试中不工作)。
我认为我有以下选择:
无法解决我的问题,因为MyEnum是私有的。例如,我不能使用@PrepareForTest({MyEnum.class})注释,因为MyEnum不可访问 我只是想知道,如果你不是
MyClazz
的作者,为什么要测试方法的内部结构,而该方法需要测试?我假设您在自己的应用程序代码中使用这个类,那么为什么不模拟调用MyClazz.methodWhichIWantTest
并跳过内部内容呢?如果getMyClazzB
抛出异常,则表示您测试不好或者代码中有错误,请不要尝试跳过异常,处理好它。这就是为什么单身汉不好。这只是lazymans对单例的实现。如果您在深层次上对其进行模拟,那么您将永远拥有模拟(直到JVM重新启动)以及所有后续测试。如果你真的想测试这个,你必须修改代码,并将单例代码从测试代码中分离出来。这是否回答了你的问题?嗯,doSomething
和methodWhichIWantTest
都是MyClazzB的方法,那么您不需要模拟私有枚举