如何在java中的injectmocks注释类下模拟私有方法

如何在java中的injectmocks注释类下模拟私有方法,java,junit,mockito,powermock,spring-test,Java,Junit,Mockito,Powermock,Spring Test,我遇到一个关于注入的mock注释类中的mock私有方法的问题。我的代码如下 public class foo { @Autowired fooBean fooBean; public void method1() { this.method2(); } private void method2() { fooBean.someMethod(); system.out.println("Hello

我遇到一个关于注入的mock注释类中的mock私有方法的问题。我的代码如下

public class foo {
    @Autowired
    fooBean fooBean;

    public void method1() {
        this.method2();
    }

    private void method2() {
        fooBean.someMethod();
        system.out.println("Hello world");
    }
}
当我使用powermockito创建UT类时,foo类应该是@injectMocks,因为fooBean应该作为mock类被注入。但是当foo类被标记为@injectMocks时,它不能像“doReturn(“xxx”)那样模拟它的私有方法。当(foo,“method2”)标记为@injectMocks时,它将引发关于不能应用于injectMocks的错误


它被封锁了。不知道如何继续。

TLDR;不能使用InjectMock来模拟私有方法

您应该模拟实现细节,并关注应用程序的预期行为。同样重要的是,私有方法没有在java项目中执行核心测试逻辑

专注于编写函数,这样测试就不会受到私有方法的阻碍。如果这是不可能的,那么值得一问的是,私有方法做了什么对您的函数如此有价值,以及为什么它必须是私有的


还有其他方法来测试私有方法-您可以使用,这将允许您在运行时停止方法并向其中注入特定值。但是,同样,这是为一个不需要存在的问题找到解决方案。

测试公共API。忽略私有方法。如果您的测试类正在测试
foo
,则不应该模拟
foo
的方法,而应该模拟其依赖项。如果在<代码>方法2>代码>中有一些代码在测试环境中不起作用,考虑把它拉到另一个类中,然后被嘲笑并注入<代码> Foo。另一个(糟糕的)解决方案是使
method2
受到保护,并使用一个特殊的测试子类扩展
foo