java - Jmock/junit 测试

标签 java unit-testing jmock

如果我有一个使用 try/catch block 处理异常的 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

谢谢!

最佳答案

基本上你想做的是 模型桌面,每当您向它发送浏览消息(无论使用什么 URI)时,它都应该抛出 IOException,而不是点击该 URI。

我很早以前就使用过Jmock。据我所知,JMock 有一些限制,例如它不提供模拟静态方法的机制。我不确定在 jmock 世界中模拟浏览器类有多容易。

然而,使用 jmockit 来测试它几乎是微不足道的,它支持各种花哨的模拟机制(包括静态引用、单例等)。 (我提到 jmockit 是因为无论你的浏览类是什么,jmockit 都可以模拟它。)

下面是 excerpt from an example from their website :

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

如果你想坚持使用jmock,也可以。但是你需要给我们更多关于Desktop类及其浏览方法的信息,以便我们可以思考在jmock世界中我们可以做什么。

关于java - Jmock/junit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217880/

相关文章:

java - 在if()中重现java逻辑控制

java - 如何使 Websphere App 将每个应用程序日志条目重定向到不同的文件?

java - 使用 id 和 onclickListener 的 removeViewAt

python - sys.stdin 的模型?

java - 如何简化测试?

php - Laravel phpunit 测试失败。转到意外的页面。只发生在测试中

java - 使用 Jmockit 模拟公共(public)方法

java - 模拟静态方法

java - 无法解析类引用 org/openqa/selenium/WebDriver