Java PowerMock';s expectNew()不是';不要像预期的那样模拟构造函数

Java PowerMock';s expectNew()不是';不要像预期的那样模拟构造函数,java,constructor,easymock,powermock,Java,Constructor,Easymock,Powermock,我正试图了解各种模拟库的详细情况,下一个是(特别是EasyMock扩展)。我试图模拟一个构造函数,但当我尝试复制它们时,提供的示例没有相同的响应。据我所知,它从不模仿构造函数,只是继续进行,就好像它是正常的一样 这是测试类: @RunWith(PowerMockRunner.class) @PrepareForTest({Writer.class}) 公共类FaultInjectionSituationTest{ @试验 public void testActionFail()引发异常{ Fau

我正试图了解各种模拟库的详细情况,下一个是(特别是EasyMock扩展)。我试图模拟一个构造函数,但当我尝试复制它们时,提供的示例没有相同的响应。据我所知,它从不模仿构造函数,只是继续进行,就好像它是正常的一样

这是测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class})
公共类FaultInjectionSituationTest{
@试验
public void testActionFail()引发异常{
FaultInjectionSituation fis=新的FaultInjectionSituation();
expectNew(Writer.class,“test”)
.anthrow(新IOException(“从模拟中抛出”);
PowerMock.replay(Writer.class);
System.out.println(fis.action());
验证(Writer.class);
}
}
我曾尝试用EasyMock.isA(String.class)替换“test”,但结果相同

这是FaultInjectionSituation:

public类FaultInjectionSituation{
公共字符串操作(){
作家w;
试一试{
w=新编写者(“测试”);
}捕获(IOE异常){
System.out.println(“抛出:+e.getMessage());
返回e.getLocalizedMessage();
}
return“无掷而归”;
}
}
“编写器”只不过是一个类的外壳:

公共类编写器{
公共编写器(字符串s)引发IOException{
}
public Writer()引发异常{
}
}

当测试运行时,它打印出“returned without throw”,表示从未抛出异常。

您需要首先创建一个模拟对象:

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

您还需要准备调用构造函数的类,以便PowerMock知道需要模拟的构造函数调用。尝试使用以下内容更新代码:

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

我不是试图创建一个模拟对象,而是试图截获构造函数并在其位置抛出一个异常。的“更多功能”部分是我的目标。对不起,我知道你想做什么。我刚刚在JUnit4上尝试了您的代码,它打印出了“从模拟中抛出”(您所期望的)。您是否有可能使用TestNG?我不熟悉TestNG,但当我使用TestNG运行它时,我使用Junit4得到了“返回而不抛出”。我想不出任何会导致它不工作的东西。我不认为你的代码有任何问题(因为我能够得到想要的输出)。你如何运行JUnit?从IDE还是命令行?我都试过了。我把它交给一个同事在他们的机器上运行,也许这将有助于说明问题。谢谢,我没有意识到调用构造函数的对象也需要包括在内。我遇到了同样的问题。。。正是我所缺少的:)非常感谢,我挣扎了很长一段时间,直到找到了这个答案。