簡體   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