简体   繁体   English

PowerMock的expectNew()并没有按预期模拟构造函数

[英]PowerMock's expectNew() isn't mocking a constructor as expected

I'm trying to learn the ins and outs of various mocking libraries and PowerMock (specifically the EasyMock extension) is next on the list. 我正在尝试学习各种模拟库的细节, PowerMock (特别是EasyMock扩展)是下一个列表。 I'm attempting to mock a constructor and the examples provided don't have the same response when I try to replicate them. 我试图模拟一个构造函数,当我尝试复制它们时,提供的示例没有相同的响应。 As far as I can tell, it never mocks the constructor and just proceeds as if it were normal. 据我所知,它从不嘲笑构造函数,只是继续进行,就像它是正常的一样。

This is the test class: 这是测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class})
public class FaultInjectionSituationTest {

    @Test
    public void testActionFail() throws Exception {
        FaultInjectionSituation fis = new FaultInjectionSituation();
        PowerMock.expectNew(Writer.class, "test")
           .andThrow(new IOException("thrown from mock"));
        PowerMock.replay(Writer.class);
        System.out.println(fis.action());
        PowerMock.verify(Writer.class);
    }

}

I've tried replacing the "test" with an EasyMock.isA(String.class), but it yielded the same results. 我尝试用EasyMock.isA(String.class)替换“test”,但它产生了相同的结果。

This is the FaultInjectionSituation: 这是FaultInjectionSituation:

public class FaultInjectionSituation {

    public String action(){
        Writer w;
        try {
            w = new Writer("test");
        } catch (IOException e) {
            System.out.println("thrown: " + e.getMessage());
            return e.getLocalizedMessage();
        }
        return "returned without throw";
    }
}

The "Writer" is nothing more than a shell of a class: “作家”只不过是一个类的壳:

public class Writer {
    public Writer(String s) throws IOException {
    }

    public Writer() throws IOException{
    }
}

When the test is run, it prints out "returned without throw", indicating the exception was never thrown. 当测试运行时,它打印出“return without return”,表示从未抛出异常。

You need to prepare the class that is calling the constructor as well, so PowerMock knows to expect a mocked constructor call. 您还需要准备调用构造函数的类,因此PowerMock知道期望一个模拟的构造函数调用。 Try updating your code with the following: 尝试使用以下代码更新代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class, FaultInjectionSituation.class})
public class FaultInjectionSituationTest { 
 // as before
}

You need to first create a mock object: 您需要先创建一个模拟对象:

Writer mockWriter = PowerMock.createMock(Writer.class)
PowerMock.expectNew(Writer.class, "test").andReturn(mockWriter)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM