[英]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.