Spring Boot 防止在测试中记录异常

oaxa6hgo  于 2023-02-04  发布在  Spring
关注(0)|答案(2)|浏览(106)

我有一个SpringBoot测试,它Assert测试方法在某些情况下会抛出一个异常。然而,测试方法捕获并分组多个错误,记录细节,并(重新)只抛出一个“ServiceException”。
(* 记录并重新引发完全相同的异常将是反模式,但不是这种情况 *)
这是一个服务方法,做了很多事情,用户/客户端不应该被所有的细节所困扰。大多数问题都是无关紧要的,除了“稍后再试”之外没有什么可做的。
测试工作正常(抛出异常时通过),但我也看到了原始的stacktrace日志(在生产中应该是这样)。然而,在进行测试时,不希望看到这个错误显示在日志中,好像它是一个真实的的错误一样。(尽管可能是测试做得不好的情况)
所以问题是,我怎样才能抑制只为这一个测试用例记录错误呢?(防止所有测试都记录错误并不是一个解决方案。只有特定的测试用例才需要异常)
测试方法示例:

public boolean isThisParameterGoodToUse(Object parameter) throws ServiceException {
    try {
        boolean allWasOk = true;
        // Do stuff that may throw exceptions regardless of the parameter
        return allWasOk;
    } catch (IOException | HttpException | SomeException | YetAnotherException e) {
        String msg = "There was a problem you can do nothing about, except maybe 'try again later'.";
        this.log.error(msg, e); // Relevent for system monitors, nothing for the client
        throw new ServiceException(msg);
    }
}

然后测试看起来会像这样(类被注解为'@SpringBootTest'并且它使用'Jupiter-api'):

@Test
public void isThisParameterGoodToUse() {
    assertThrows(ServiceException.class,
        () -> this.injectedService.isThisParameterGoodToUse("This is not a good parameter at all!"));
}

当我运行测试时,我会收到要记录的错误消息,例如:

com.myProd.services.SomeException: Well ain't that some! Check if you have the power cord plugged in.
    at ... <lots of stackTrace> ...
aiqt4smr

aiqt4smr1#

如果应该为单个测试类取消日志记录,则可以使用

@SpringBootTest(properties = "logging.level.path.to.service.MyService=OFF")

如果在所有测试中都应禁止记录日志,请将其添加到application.properties

  • 测试/资源/application.properties*
logging.level.path.to.service.MyService=OFF

更新
通过将测试嵌套在单独的类中,可以取消单个测试的日志记录

@SpringBootTest
class DemoServiceTest {

    @Autowired DemoService service;

    @Test
    void testWithErrorLogging() {
        // ...
    }

    @Nested
    @SpringBootTest(properties = {"logging.level.com.example.demo.DemoService=OFF"})
    class IgnoreExceptionTests{
        @Test
        void isThisParameterGoodToUseWithOutError() {
            Assertions.assertThrows(
                    ServiceException.class,
                    () -> {
                        service.isThisParameterGoodToUse("blabala");
                    }
            );
        }
    }
}
dsf9zpds

dsf9zpds2#

不要在日志中隐藏异常,即使是在测试中。

在测试中看到抛出的异常是一件好事,因为这意味着您的测试涵盖了抛出异常的情况。
最需要做的事情是验证异常沿着正确的消息是否也被正确地抛出(因为您不想模拟日志记录器或监视它或任何事情)。

@Test
void isThisParameterGoodToUse() {
    assertThrows(ServiceException.class,
         () -> this.injectedService.isThisParameterGoodToUse("This is not a good parameter at all!"), 
   "There was a problem you can do nothing about, except maybe 'try again later'.");
}

相关问题