java - PowerMocking一个新的实例化

  显示原文与译文双语对照的内容

我用PowerMock测试的类中,类的实例化如下


EmailMessage msg = new EmailMessage(getExchangeSession());

EmailMessage 是我正在模拟的第三方工具,getExchangeSession() 是 enherited protected 方法。 我需要模拟 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如何模仿这个 protected 方法?

时间:

如果要测试的类包含以下代码行:


EmailMessage msg = new EmailMessage(getExchangeSession());

然后,不能通过的构造函数跳过对 getExchangeSession()的调用- 调用构造函数之前调用它,然后返回值,然后传递给 EmailMessage ( 不管那是真实的还是被模仿的) 。

因这里,如果不能设置类,这样对 getExchangeSession的调用就需要模仿这个调用,如下所述: 模拟 protected 方法

在正确理解你的问题时,你需要模拟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.. .

}

...