用mockito进行Java测试:mock类对象
我想在我的类中模拟一个对象用mockito进行Java测试:mock类对象,java,unit-testing,mockito,Java,Unit Testing,Mockito,我想在我的类中模拟一个对象 public class Controller{ private StandardEmailSender sender = new StandardEmailSender(); public void process() throws EmailException { // do some stuff sender.sendEmail(to, subject, body); // do some stuff
public class Controller{
private StandardEmailSender sender = new StandardEmailSender();
public void process() throws EmailException {
// do some stuff
sender.sendEmail(to, subject, body);
// do some stuff
}
}
我想模仿发件人。发送电子邮件(收件人、主题、正文)代码>。我花了很多时间寻找解决方案,但我被卡住了。我试图直接模拟对象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
}
有人能解决我的问题吗?谢谢 这里有两种选择:
- 使您的测试用例能够“手动”注入(模拟的)发送者对象(例如,通过提供一个构造函数来设置该字段)
- 利用Mockitos注释
private final Sender sender;
public Controller() { this(new StandardEmailSender()); }
Controller(Sender sender) { this.sender = sender; }
通过这样做,客户端仍然可以创建一个控制器实例,而不必担心提供发送方,并且您的单元测试可以使用该包保护的构造函数来提供模拟的发送方实例。使用依赖项注入的形式,例如:
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();
}
@卡格尔马赫:是的,确实如此。但有些人仍然不喜欢:……如果你觉得我的答案足够,请不要忘记在某个时候接受。