簡體   English   中英

Jmock / junit測試

[英]Jmock/junit testing

如果我有一個使用try / catch塊處理異常的SUT,如下所示:

public static void methodToBeTested() {
    ...
    try {
        desktop.browse(new URI("www.google.com"));
    } catch (IOException e) {
        //Display message to user and log out entry in app logs
    }
    ...
}

問題是我應該從單元測試中測試拋出IOException的條件嗎? (被測方法在默認瀏覽器中啟動URI)

如果是,由於我沒有從此方法引發異常,因此當desktop.browse()引發IOException時如何對這種情況進行單元測試?

有什么想法或建議嗎? 我正在使用JMock

謝謝!

基本上,您想要做的是對Desktop進行建模,並且無論何時向其發送瀏覽消息(無論使用什么URI),它都不會拋出該URI,而應拋出IOException。

我很久以前使用過Jmock。 據我所知,JMock有一些局限性,例如,它沒有提供模擬靜態方法的機制。 而且我不確定在jmock世界中模擬瀏覽器類有多么容易。

但是,使用jmockit對其進行測試幾乎是微不足道的,它支持各種花哨的模擬機制(包括靜態引用,單例等)。 (我之所以提到jmockit,是因為無論您的瀏覽類是什么,jmockit都可以對其進行模擬。)

以下是他們網站示例摘錄

package jmockit.tutorial.domain;

import org.apache.commons.mail.*;
import jmockit.tutorial.persistence.*;

import org.junit.*;
import mockit.*;

public final class MyBusinessService_ExpectationsAPI_Test
{
   @Mocked(stubOutClassInitialization = true) final Database unused = null;
   @Mocked SimpleEmail anyEmail;

   @Test
   public void doBusinessOperationXyz() throws Exception
   {
      final EntityX data = new EntityX(5, "abc", "abc@xpta.net");
      final EntityX existingItem = new EntityX(1, "AX5", "someone@somewhere.com");

      new Expectations() {{
(1)      Database.find(withSubstring("select"), any);
         result = existingItem; // automatically wrapped in a list of one item
      }};

      new MyBusinessService(data).doBusinessOperationXyz();

(2)   new Verifications() {{ Database.persist(data); }};
(4)   new Verifications() {{ email.send(); times = 1; }};
   }

   @Test(expected = EmailException.class)
   public void doBusinessOperationXyzWithInvalidEmailAddress() throws Exception
   {
      new Expectations() {{
(3)      email.addTo((String) withNotNull()); result = new EmailException();
      }};

      EntityX data = new EntityX(5, "abc", "someone@somewhere.com");
      new MyBusinessService(data).doBusinessOperationXyz();
   }
}

上面是正在測試的類,下面是一個專門測試上述代碼的(3)部分的測試。 我認為這與您要嘗試執行的操作類似。 請檢查一下。

   @Test(expected = EmailException.class)
   public void doBusinessOperationXyzWithInvalidEmailAddress() throws Exception
   {
      new MockUp<Email>() {
         @Mock
(3)      Email addTo(String email) throws EmailException
         {
            assertNotNull(email);
            throw new EmailException();
         }
      };

      new MyBusinessService(data).doBusinessOperationXyz();
   }
}

如果您要堅持模擬,那很好。 但是,然后您需要向我們提供有關Desktop類及其瀏覽方法的更多信息,以便我們考慮在jmock world中可以做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM