我想模拟类中的一个对象。
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 的典型方法是使用构造函数伸缩,如下所示:
公共类控制器 {
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();
}