PowerMocking一个新的实例化

时间:2013-06-12 12:13:31

标签: java easymock powermock

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

EmailMessage msg = new EmailMessage(getExchangeSession());

EmailMessage是我嘲笑的第三方工具,而getExchangeSession()是一种受保护的方法。我需要嘲笑EmailMessage,但我真的不关心对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如何模拟这种受保护的方法?

2 个答案:

答案 0 :(得分:1)

如果您正在测试的课程中包含以下内容:

EmailMessage msg = new EmailMessage(getExchangeSession());

然后你不能通过强制调用getExchangeSession()的构造函数来跳过对EmailMessage的调用 - 在调用构造函数之前调用它,然后将返回值传递给EmailMessage(无论是真实的还是嘲笑的。)

因此,如果您无法设置您的课程以致getExchangeSession的调用有效,则需要按照此问题所述模拟该调用:mocking protected method

答案 1 :(得分:0)

正如我正确理解您的问题,您希望模拟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 ...

}