【问题标题】:Using Mockito how to ensure that an exception was thrown in a method使用 Mockito 如何确保在方法中抛出异常
【发布时间】:2019-12-24 17:02:18
【问题描述】:

我正在使用 Mockit。我有一种情况,方法抛出异常,捕获异常并记录异常(并且不重新抛出)。

Class Test {

       public void abc() {

            try {
                  xyz();
            } catch (Exception e) {
                  LOGGER.error("Exception thrown {} ", e);
            }
       } 

      private void xyz() {
         // Can throw  exception 
         // which goes to the 
         // callee   
      }
}

现在,对于某些情况,xyz() 可能会抛出异常,并且会在 abc() 中捕获。我想测试的正是这种情况。我不能使用@Test(Expected=SomeException.class),因为正在捕获和记录异常。但是,我的测试用例应该看看是否抛出了这个异常。

我确实在网上搜索过,但没有找到任何相关内容。

任何关于如何接近的指针都会有所帮助。

我提到了this SO question,看起来很相似,但不是我要找的。​​p>

【问题讨论】:

  • 注入一个模拟记录器,并验证模拟记录器是否已被调用:据我们所知,这是此类异常的唯一可见效果。
  • @JBNizet:请您详细说明一下。我在使用 Mockito 方面处于基本水平。
  • 类似Logger mockLogger = mock(Logger.class); Test test = new Test(mockLogger); test.abc(); verify(mockLogger).error(any(), any());
  • 您必须重构代码以使其可测试。例如,通过将私有方法提取到一个单独的类中,注入到您拥有的类中,然后对该提取的方法进行单元测试。或者通过注入记录器而不是使用私有静态记录器。
  • 我个人对此的看法是,我必须使用 Powermock,然后这是我需要重构代码的标志。所以我从不使用 Powermock。

标签: java junit mockito tdd bdd


【解决方案1】:

IMO,基本上你有两个选择:

  1. 模拟记录器(为此执行任何您需要的操作 - 重构、powermock 等),这已在 cmets 中进行了描述。除了说明(根据我的个人经验)通常不鼓励使用 PowerMock 之外,我真的不能再添加太多了。

  2. 使用“创造性”解决方法:从测试中以编程方式 将人工附加器添加到与类关联的记录器。 appender 是一个“特殊”的,它将存储日志事件并提供对其进行验证的访问权限:

// pseudo code that might vary depending on the actual logging framework of your choice
class MyTestAppender extends Appender {
     private LoggingEvent evt = null;
     public void doAppend(LoggingEvent evt) {
       this.evt = evt; 
     }
     public LoggingEvent getEvent() {
       return this.evt;
     }
}

// in test:

@Test
void test() {
    Logger logger = LoggerFactory.getLogger(ClassUnderTest.class);
    MyTestAppender myTestAppender = new MyTestAppender();
    logger.addAppender(myTestAppender);

    classUnderTest.doStuff();
    // now you can verify whether the event has been logged (and stored by the appender):

    LoggingEvent evt = myTestAppender.getEvent();
    assertNotNull(evt); // cool, something was really logged, lets see what:
    assertThat( // verify message, cause exception, whatever you want here
}

【讨论】:

  • 感谢您的建议和样品。如果我需要,让我试试看。感谢您分享您的知识,对此我深表感谢。
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多