Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用mockito进行Java测试:mock类对象_Java_Unit Testing_Mockito - Fatal编程技术网

用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注释
选项1的典型方法是使用构造函数伸缩,如下所示:

公共类控制器{

 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();
}

@卡格尔马赫:是的,确实如此。但有些人仍然不喜欢:……如果你觉得我的答案足够,请不要忘记在某个时候接受。