使用Mockito如何确保方法中引发了异常

问题描述 投票:-1回答:1

我正在使用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,它看起来很相似,但不是我想要的。

java junit mockito tdd bdd
1个回答
1
投票

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

  1. 模拟记录器(执行此操作所需的任何操作-重构,powermock等),这已在注释中描述。除了声明(基于我的个人经验)不鼓励通常不使用PowerMock之外,我不能对其添加太多内容。

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

// 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
}
© www.soinside.com 2019 - 2024. All rights reserved.