当前位置: 首页 > 知识库问答 >
问题:

PowerMockito验证Times始终p资产私有方法

池永长
2023-03-14
public class TestedClass
{
    
    public void publicMethod() 
    {
        privateMethod();
    }
    
    private void privateMethod() 
    {
    }
}

我想用PowerMockito测试私有方法是否只被调用一次。

这是我的测试类:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
public class TestedClassTest
{
    
    @Before
    public void setUp()
    {
    }
    
    @Test
    public void testPrivateMethodCalledOnce() throws Exception 
    {
        TestedClass spy = PowerMockito.spy(new TestedClass());
        spy.publicMethod();
        
        PowerMockito.verifyPrivate(spy, Mockito.times(772)).invoke("privateMethod"); 
    }
}

尽管只在测试通过后调用。即使我在public方法中评论privateMethod,测试似乎也通过了。

public class TestedClass
{

    public void publicMethod() 
    {
        //privateMethod(); <-- test still passes
    }

    private void privateMethod() 
    {
    }
}

有人知道我做错了什么吗?有人知道如何验证私有方法在单元测试中只调用了一次吗?

共有2个答案

蒯硕
2023-03-14

问题可能是:

.invoke("privateMethod")

可以解释为:

  1. void invoke(stringmethodtoverify,Object…arguments)javadoc,这是我们(显然)想要的。或

因此,解决方案可以是(避免不正确的过载):

.invoke("privateMethod", new Object[0]) // which still *could* be 
   // confused with Object... but I "hope" the String in front saves us!:)
// if this works: .invoke("privateMethod", null) should also work.

或者正确地使用其中一种替代方法#

但这通常是过载库的问题... varargs使事情变得更糟/潜在的确定性!:-)

穆鸿波
2023-03-14

似乎我需要在这个特定的测试中包含@PREareForTest注释才能使其工作。现在测试失败了,这是它应该做的。另外-当我换成Mockito.times(1)时,它会起作用。

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
@PrepareForTest(TestedClass.class) // <--- I didn't include this in the question
public class TestedClassTest
{
    
    @Before
    public void setUp()
    {
    }
    
    @Test
    public void testPrivateMethodCalledOnce() throws Exception 
    {
        TestedClass spy = PowerMockito.spy(new TestedClass());
        spy.publicMethod();
        
        PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke("privateMethod"); 
    }
}
 类似资料:
  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 我有一门课看起来像这样: 我想使用Mockito和Powermock为此编写一个单元测试。我知道我可以这样模仿私有方法: 但是我如何告诉它抛出异常呢?我知道会是这样的: 那里有什么? 请注意,异常是一个私有内部类,因此我不能只执行,因为从单元测试中无法访问。

  • 有人能帮帮我吗?提前谢了。

  • 我试图在测试的类中模拟一个私有方法,如下所示。 现在我需要测试方法和mock。 我尝试创建间谍的上述类,但该方法得到调用时,我这样做下面 在第二行本身被调用。而且,不会被模仿。 也许我用错误的方式创建了间谍对象?无法执行

  • 我需要使用TestNG、Mockito和现在的PowerMockito针对预先存在的代码库编写单元测试,以更轻松地测试私有和静态方法。我目前正试图针对我们正在测试的类中的一个私有void方法编写一个测试,但无法解决这个问题。在普通的PowerMock API中,有一些方法称为“replayAll()”、“verifyAll()”、“expectLastCalled()”、“code>”,它们适用于