【问题标题】:Jmock/junit testingJmock/junit 测试
【发布时间】:2015-07-04 15:19:20
【问题描述】:

如果我有一个使用 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

谢谢!

【问题讨论】:

  • 消息将如何显示?您可以检查这一点,或者是否发生了“注销条目”。如果一个方法没有抛出异常,则您不必测试是否发生了异常。虽然,如果由于错误而发生某些事情,您始终可以检查异常的结果。我看不出嘲笑适合这个问题的地方

标签: java unit-testing jmock


【解决方案1】:

基本上你想做的是 模拟桌面,并且无论何时向其发送浏览消息(无论使用什么 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 世界中可以做些什么。

【讨论】:

  • 您好,感谢您的洞察!上面的Desktop 类来自java.awt.Desktop。另外,我在整个项目中都使用了 JMock,所以我不确定是否应该将测试类与 Jmock 和 mockito 等 2 个框架混合来测试这一种方法..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多