java - 通过whennew()的powermock模拟构造函数不适用于匿名类

标签 java junit mockito powermock

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

版本:

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
    }
}

最佳答案

你需要准备好调用构造函数的类,而不是调用构造函数的类,下面应该解决你:

@PrepareForTest(DummyTarget.class)

欲了解更多信息,请查看 this页面。

关于java - 通过whennew()的powermock模拟构造函数不适用于匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13481702/

相关文章:

Java GUI 没有图形的淡入淡出动画

java - 在线程进行额外处理之前和之后重新绘制玻璃板

java - Hibernate:如何指定左侧条件?

java - 在 junit 上执行 easymock 时出现断言错误

java - 在 Android Instrumentation 测试中使用 PowerMock 和 Mockito - 错误 - 重复文件 - org.mockito.plugins.MockMaker

java - 错误: package com. firebase.ui.database不存在

java - 在测试数据库操作时将数据库重置为已知状态的最佳方法是什么?

java - 您如何断言在 JUnit 测试中引发了某个异常?

java - 如何对 guice createinjector 方法进行单元测试

java - mockito 可以抛出一般异常吗