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

powermock模拟构造函数via whennew()不适用于匿名类

宗政霄
2023-03-14

我有一个DummyResources类和一个DummyTarget文件,以及一个测试类TestDummyResources,如下所示,但是mocked对象DummyResources dr=mock(DummyResource.class)仅在我调用普通类中的构造函数时才有效,当它在匿名类中调用时,它调用实际的构造函数而不是使用mocked对象。

版本:

powermock 1.4.12 mockito 1.9.0 junit 4.8.2

DummyTarget。java:

import java.io.IOException;
import java.io.OutputStream;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;


public class DummyTarget {
    public StreamingOutput testMocking() {
        return new StreamingOutput() {
            @Override
            public void write(OutputStream arg0) throws IOException, WebApplicationException {
                new DummyResource();
            }
        };
    }
}

DummyResource。java:

package com.smin.dummy;

public class DummyResource {
    public DummyResource() {
        System.out.println("mock failure");
    }
}

TestDummyResource。java:

package com.smin.dummy;

import static org.mockito.Mockito.mock;

import java.io.IOException;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({DummyResource.class,DummyTarget.class})
public class TestDummyResource  {

    @Before
    public void setUp() throws Exception {
        DummyResource dr = mock(DummyResource.class);
        PowerMockito.whenNew(DummyResource.class).withNoArguments().thenReturn(dr);
    }

    @Test
    public void testMocked() throws WebApplicationException, IOException {
        new DummyResource(); // it uses the mocked object dr here, 
                             //doesn't print "mock failure"
        StreamingOutput sop = new DummyTarget().testMocking();
        sop.write(null);     // it calls DummyResource's constructor,
                             // prints ""mock failure"" here
    }
}

共有3个答案

虞俊美
2023-03-14

实际上,您必须准备测试调用构造函数的类,而不是调用构造函数的类。看见https://github.com/jayway/powermock/wiki/MockConstructor.

在您的情况下,应该使用@PrepareForTest(DummyTarget.class)

魏安然
2023-03-14

看起来一个匿名类可能会继承定义它的类的包。您可以尝试PREareForTest的通配符形式吗?:

@PrepareForTest("com.smin.dummy.*")

如果这不起作用,您可以尝试使用霰弹枪PrepareEverythingForTest注释。

蔡明贤
2023-03-14

您需要准备调用构造函数的类,而不是调用构造函数的类,以下内容应该可以解决您的问题:

@PrepareForTest(DummyTarget.class)

有关更多信息,请查看此页。

 类似资料:
  • 问题内容: 我有一个DummyResource类和一个DummyTarget文件,以及一个测试类TestDummyResource,如下所示,但是模拟对象仅在我在普通类中调用构造函数时才起作用,在匿名类中调用它时,它调用的是实际构造函数而不是使用模拟对象。 版本: powermock 1.4.12模拟1.9.0 junit 4.8.2 DummyTarget.java: DummyResource

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

  • 例如,我有一个这样的课; 我要做的是为模拟的构造函数编写单元测试。 如果是静态的,那么这将很容易,因为我可以使用然后调用构造函数。 有人知道有什么办法吗?

  • 问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito

  • 我正在为我的java类编写测试类。我将Junit5与Mockito一起使用。 我使用的Junit5与Power Mockito不兼容,所以我只使用Mockito。 我有,它具有下面这样的函数,并且在构造函数中初始化了。 当我编写测试用例时,我模拟了,但是由于我们在一个方法中创建,我如何模拟,这样我就可以编写期望值,根据我在测试类中设置的选择获得值?