繁体   English   中英

使用mockito进行Java测试:模拟类对象

[英]Java testing with mockito: mock class object

我想模仿我班上的一个对象。

public class Controller{

   private StandardEmailSender sender = new StandardEmailSender();

    public void process() throws EmailException {
       // do some stuff
       sender.sendEmail(to, subject, body);
       // do some stuff
    }
 }

我想模拟sender.sendEmail(to, subject, body); 我花了很多时间找到解决方案但是我被卡住了。 我试图像这样直接模拟对象StandardEmailSender:

@Mock
StandardEmailSender sender;

@Before
public void setUp() throws EmailException {
    MockitoAnnotations.initMocks(this);

    doNothing().when(sender).sendEmail(anyString(), anyString(), anyString());
}

@Test
public void test() throws EmailException {
    Controller controller= new Controller ();
    controller.process();

    //make some asserts
}

有人可以解决我的问题吗? 谢谢!

你有两个选择:

  • 使您的测试用例可以“手动”注入(模拟的)Sender对象(例如,通过提供构造函数来设置该字段)
  • 利用Mockitos @InjectMocks注释

选项1的典型方法是使用构造函数telescoping,如下所示:

公共类控制器{

 private final Sender sender;

 public Controller() { this(new StandardEmailSender()); }
 Controller(Sender sender) { this.sender = sender; }

通过这样做,客户端仍然可以创建一个Controller实例而不必担心提供发送者,并且您的单元测试可以使用该包受保护的构造函数来提供模拟的发送者实例。

使用依赖注入的形式,例如:

public class Controller{
   private final EmailSender sender;

   Controller(EmailSender emailSender) {
       this.sender = Objects.requireNonNull(emailSender); 
   }

   public Controller() {
      this(new StandardEmailSender());
   }     
}

在你的测试中:

@Test
public void test() throws EmailException {
    Controller controller= new Controller(mockedSender);
    controller.process();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM