Java powermock创建一个新的实例化

Java powermock创建一个新的实例化,java,easymock,powermock,Java,Easymock,Powermock,在我用PowerMock测试的一个类中,我有一个类的以下实例化 EmailMessage msg = new EmailMessage(getExchangeSession()); EmailMessage是我正在模仿的第三方工具,getExchangeSession()是一个增强的受保护方法。我需要模拟电子邮件,但我真的不在乎调用getExchangeSession() 目前我有以下内容,但仍然调用getExchangeSession()方法: @RunWith(PowerMockRunne

在我用PowerMock测试的一个类中,我有一个类的以下实例化

EmailMessage msg = new EmailMessage(getExchangeSession());
EmailMessage
是我正在模仿的第三方工具,
getExchangeSession()
是一个增强的受保护方法。我需要模拟
电子邮件
,但我真的不在乎调用
getExchangeSession()

目前我有以下内容,但仍然调用
getExchangeSession()
方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest({EmailProvider.class, ExchangeService.class})
public class MyTest {

    @Test
    public void test() {
        EmailMessage emailMessage = createMock(EmailMessage.class);
        ExchangeService exchangeService = createMock(ExchangeService.class);
        expectNew(EmailMessage.class, exchangeService).andReturn(emailMessage);

        // test setup and call to the class under test
        Email email = new Email();
        new EmailProvider().send(email);
    }
}

public class EmailProvider() extends ClassWithProtectedAccess {
    public void send(Email email) {
        EmailMessage msg = new EmailMessage(getExchangeSession());

        // and here follows the code that I am actually testing
        // and which works on the msg (EmailMessage)
        // ...
    }
}
EmailProvider.send()的第一行是运行
getExchangeSession()
,然后失败的

因此,显然我不能跳过对
getExchangeSession()
的调用,我可能也应该模拟这个方法。这是正确的吗?
如果是这样的话,使用PowerMock和EasyMock如何模拟这个受保护的方法?

我正确理解了您的问题,您希望模拟EmailMessage类,但在创建实例时需要跳过构造函数调用

    ... test setup and call to the class under test ...
    Email email = new Email();
    new EmailProvider().send(email);
问题在于你测试的方式。您的目的是在send方法中测试代码。不能只调用send()方法进行测试。您需要编写代码,通过模拟依赖类来测试send()方法中的语句,并测试该类中的其他语句

public void testSend() throws Exception 
{
  // you need to suppress the constructor before you mock the class.
   PowerMockito.suppress(PowerMockito.constructor(EmailMessage.class));
   EmailMessage emailMessage = PowerMockito.mock(EmailMessage.class);
   Email email = new Email();
   emailMessage.setSubject(email.getSubject());
  // ...your other code here ...

}

如果您正在测试的类中有此行:

EmailMessage msg = new EmailMessage(getExchangeSession());
然后,您不能通过对
EmailMessage
的构造函数进行powermock来跳过对
getExchangeSession()的调用-它在调用构造函数之前被调用,返回值随后被传递到
EmailMessage
(不管它是真实的还是模拟的)


因此,如果您无法设置类以使对
getExchangeSession
的调用正常工作,那么您需要模拟该调用,如本问题所述:。

您是否已将其添加到测试中@RunWith(PowerMockRunner.class)@PrepareForTest(Test.class)。此外,您还可以查看此链接以了解powermock.expectprivate的使用,它可能也适用于受保护的方法(我自己使用justmock,所以不是100%确定)编辑(添加链接):感谢您的回答。不幸的是,它没有改变任何东西-getExchangeSession()仍然被调用。我已经编辑了答案。如果您认为有差异,请告诉我您的评论或您的观点。我不想在代码中调用EmailMessage.setSubjet(),因为我需要测试的方法是EmailProvider.send()-它在处理过程中调用EmailMessage.setSubjet()。