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

使用PowerMock、Mockito和TestNG模拟公共方法中使用的私有方法

薛烈
2023-03-14

我想为我拥有的一个类编写一个单元测试。这个类有一个公共方法,在公共方法内部有对同一个类中的私有方法的调用。我想模拟对那些私有方法的调用。类与此类似:

public class SomeClass {
    public int somePublicMethod(int num) {
        int num2 = somePrivateMethod1(num);
        int num3 = somePrivateMethod2(num);

        return num2 + num3;
    }

    private int somePrivateMethod1(int num) {
        return 2*num;
    }

    private int somePrivateMethod2(int num) {
        return 3*num;
    }
}

对于我的单元测试,我尝试将PowerMock与Mockito和TestNG一起使用。下面是我对测试SomePublicMethod的测试的尝试:

import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.spy;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.Assert;
import org.testng.annotations.Test;

@PrepareForTest(SomeClass.class)
public class SomeClassTest {

    @Test
    public void testSomePublicMethod() throws Exception {
        int num = 4;        

        SomeClass someClassSpy = spy(new SomeClass());

        doReturn(8).when(someClassSpy, "somePrivateMethod1", num);
        doReturn(12).when(someClassSpy, "somePrivateMethod2", num);

        int result = someClassSpy.somePublicMethod(num);

        Assert.assertEquals(result, 20);
    }
}

当我运行这个测试时,我会得到一个异常和一些提示:

FAILED: testSomePublicMethod
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:31)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

我在网上看了一些例子,但是我还没有找到一个专门使用PowerMock和Mockito和TestNG来完成我想要的任务的例子。有谁能给我一些建议,我可以做什么不同的?

共有1个答案

轩辕海
2023-03-14

我不认为这是PowerMock的问题。看起来它应该能正常工作。我想知道TestNG与PowerMock交互是否有问题?

我没有TestNG的经验,所以我尝试在JUnit中运行这个类。someClass保持原样,someClastest作了最小修改以使用JUnit:

import static org.powermock.api.mockito.PowerMockito.*;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class SomeClassTest {

    @Test
    public void testSomePublicMethod() throws Exception {
        final int num = 4;

        final SomeClass someClassSpy = spy(new SomeClass());

        doReturn(8).when(someClassSpy, "somePrivateMethod1", num);
        doReturn(12).when(someClassSpy, "somePrivateMethod2", num);

        final int result = someClassSpy.somePublicMethod(num);

        Assert.assertEquals(result, 20);
    }
}

考试通过了。

您是否需要使用@runwith或一些类似的注释来指定PowerMockRunner.class,就像使用JUnit一样?如果我删除该注释,我将收到与您发布的错误消息相同的错误消息。

编辑:

根据此链接:http://code.google.com/p/powermock/wiki/testngusage

您需要告诉TestNG使用PowerMock对象工厂。要以编程方式完成此操作,请向测试类中添加如下所示的方法:

@ObjectFactory
public IObjectFactory getObjectFactory() {
    return new org.powermock.modules.testng.PowerMockObjectFactory();
}

或者为了安全起见,您还可以从PowerMockTestCase扩展:

@PrepareForTest(SomeClass.class)
public class SomeClassTest extends PowerMockTestCase {
   //...
}
 类似资料:
  • 当我尝试使用mockito和powermock(在testng框架下使用)来模拟这些变量时,我遇到了一个问题 到目前为止我所做的 但是当我试图运行上面的代码时,我得到了以下错误: > 您使用以下任一方法存根:final/private/equals()/hashCode()方法。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。 在when()中,您不是在mock上调用method而是

  • 我正在尝试测试下一种方法: 称为PrivateMethod: asyncTask的执行无法在Mockito的测试中完成,所以我需要以某种方式模拟它。我试着用PowerMock来嘲弄私有方法: 这在PowerMockito行(NullPointerException)中给了我一个异常,它说 方法引发了“org.mockito.exceptions.Misusing.UnfinishedStubbin

  • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

  • 我试图用Mockito/PowerMock模拟一个私有方法。我得到了NullPointerException ,我尝试做的简单示例是:

  • 使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?