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

用Mockito和Powermock模拟来自同一类的构造函数和静态方法

杭令
2023-03-14

我正在编写一个与第三方Java SDK接口的应用程序。我目前正在使用Mockito和PowerMock来编写单元测试。我遇到了一个嘲笑SDK提供的类的问题。dummy类如下所示:

class A{
    public static A getInstance() {
     ...
    }

    public A(){
     ...
    }
}

我试图模拟类B,它既调用A的构造函数,又调用A中的静态方法。

class B{
    public String doSomething(){
A test1 = A.getInstance();
A test2 = new A();

...

}
}
@RunWith( PowerMockRunner.class )
@PrepareForTest( B.class )

public class BTest{

    @PrepareForTest( A.class )
    @Test
    public void testdoSomething() {

        A mockedTest1 = Mockito.mock(A.class);
        A mockedTest2 = Mockito.mock(A.class);

        PowerMockito.whenNew(A.class).withAnyArguments().thenReturn(mockedTest2)
        PowerMockito.mockStatic( A.class )
        PowerMockito.when( A.getInstance()).thenAnswer(mockedTest1)


        B b = new B();
        b.doSomething();

    }
@RunWith( PowerMockRunner.class )
@PrepareForTest( B.class )

public class BTest{

    @Test
    public void testdoSomething() {

        A mockedTest1 = Mockito.mock(A.class);
        A mockedTest2 = Mockito.mock(A.class);

        PowerMockito.whenNew(A.class).withAnyArguments().thenReturn(mockedTest2)


        B b = new B();
        b.doSomething();

    }  

我可以让构造函数被正确地嘲弄。Powermock中有什么东西可以防止同时嘲弄构造函数和静态方法吗?还是我错过了什么?

多谢了。

共有1个答案

包永新
2023-03-14

你自己已经很接近了,但是你必须考虑几件事才能让所有的碎片都符合这个谜题:

1)模拟构造函数的Powermock文档

2)用于模拟静态方法的Powermock文档

总之,在类级别或方法级别使用@PrepareForTest({a.class,b.class}),一切都应该很好。

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

  • 问题内容: 我想将构造函数模拟为方法。 在我的测试中,我想做这样的事情: 但是给我这个 错误 知道为什么吗? 问题答案: 您可以使用PowerMock模拟构造函数。 如果由于某种原因而无法使用PowerMock,则最可行的解决方案是将工厂注入到包含此方法的任何类中。然后,您将使用工厂创建对象并模拟工厂。

  • 问题内容: 什么时候应该使用构造函数,什么时候应该使用静态方法? 您能用小片段解释一下吗?我略读了一些线程,但是我仍然不清楚。 问题答案: 当您只想返回该类型的新对象并且希望简单时,请使用公共构造函数。 一个很好的例子是StringBuilder,因为它是可变的,您可能每次都想要一个新对象。 当您可能想重用对象(尤其是不可变的对象),返回子类或描述结构时,请使用静态因子方法。一个很好的例子是Enu

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

  • 问题内容: 我有以下要模拟的Logger,但要验证是否正在调用日志条目,而不是内容。 我想模拟用于LoggerFactory.getLogger()的任何类,但是我找不到如何做到这一点。到目前为止,这是我最终得到的结果: 我想知道: 我可以模拟静态模型以用于任何课程吗? 我只能似乎运行的,因此我似乎无法改变每个方法的特点。有没有解决的办法? 编辑结果: 我以为我已经尝试过了,但没有成功: 但是,谢

  • 为了测试一些遗留代码,我必须使用powermockito。原因是遗留代码没有使用依赖项注入,并且由于某些原因,我们现在无法重构代码。我们正在系统中使用ANT运行testng。我已经配置了构建。xml使用power mock和power mock testng库。我想用powermockito模拟一个构造函数,下面是示例代码。 这次测试失败了,我不知道这里出了什么问题。我还看到下面的链接配置测试与电