Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Powermock模拟私有枚举?_Java_Powermock - Fatal编程技术网

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并编写单元测试
  • 尝试模拟InitialContext并编写单元测试
  • 编辑源代码,模拟并编写单元测试
  • 直接使用java反射测试私有方法
  • 我的问题与第3点有关。我不知道如何实现第三点,我很好奇如何做到这一点,所以我问了我的问题。 恐怕不可能在合理的时间内实现第三点。 谢谢你的帮助


    无法解决我的问题,因为MyEnum是私有的。例如,我不能使用@PrepareForTest({MyEnum.class})注释,因为MyEnum不可访问

    我只是想知道,如果你不是
    MyClazz
    的作者,为什么要测试
    方法的内部结构,而该方法需要测试
    ?我假设您在自己的应用程序代码中使用这个类,那么为什么不模拟调用
    MyClazz.methodWhichIWantTest
    并跳过内部内容呢?如果
    getMyClazzB
    抛出异常,则表示您测试不好或者代码中有错误,请不要尝试跳过异常,处理好它。这就是为什么单身汉不好。这只是lazymans对单例的实现。如果您在深层次上对其进行模拟,那么您将永远拥有模拟(直到JVM重新启动)以及所有后续测试。如果你真的想测试这个,你必须修改代码,并将单例代码从测试代码中分离出来。这是否回答了你的问题?嗯,
    doSomething
    methodWhichIWantTest
    都是MyClazzB的方法,那么您不需要模拟私有枚举