使用Mockito模拟带有参数的静态空方法

问题描述

我有一个名为“ EmailService.java”的类名称

public class EmailService {
  public static void send(String emailFrom,List<String> emailTo,String subject,String message) {
    MessageBuilder builder = Email.createMessageBuilder();
    builder.addFrom(emailFrom);
    builder.addTo(emailTo);
    builder.addSubject(subject);
    builder.addMessage(message);
    
    //builder.build() returns MimeMessage object
    Email.send(builder.build());
  }
}

我需要模拟上面的“ Email.send(builder.build());”线。所以,我的测试类如下...

@RunWith(powermockrunner.class)
@PrepareForTest({EmailService.class,Email.class,MimeMessage.class,MessageBuilder.class})
public class EmailServiceTest {
  
  private EmailService emailService;
  private Mimemessage message;
  private MessageBuilder builder;
  
  @Test
  public void testSend() throws Exception {
    mockStatic(Email.class);
    mockStatic(MimeMessage.class);
    
    message = Mockito.mock(MimeMessage.class);
    builder = Mockito.spy(MessageBuilder.class);

    //Some line of code to prepare other mock data

    Mockito.when(builder.build()).thenReturn(message);
    
    powermockito.donothing().doThrow(EmailException.class).when(Email.class);
    Email.send(message);
  }
}

如果我尝试使用上述方法来应用模拟变量来模拟带有参数的静态void方法,那么我将面临以下运行时异常。

org.mockito.exceptions.missusing.UnfinishedStubbingException:在此处检测到未完成的存根:-> powermockito.donothing()。doThrow(EmailException.class).when(Email.class); 例如。 thenReturn()可能会丢失。

但是, 如果我尝试使用类似如下方法的静态void方法模拟其他参数,则如下所示。

powermockito.donothing().doThrow(EmailException.class).when(Email.class,"send",Mockito.any(MimeMessage.class));

然后我得到如下的编译时错误

Stubber类型中的when(T)方法不适用于 参数(Class ,String,Mockito.any(MimeMessage.class))

如何用参数模拟静态void方法

我正在使用以下版本的jar进行模拟。

  • powermock-module-junit4:1.7.4
  • powermock-api-mockito2:1.7.4

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)