使用Junit测试Sping Boot 应用程序启动

juud5qan  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一些业务逻辑在Sping Boot 应用程序启动时运行(即在main方法中)

@SpringBootApplication
@EnableGatewayService
@EnableAsync
@Slf4j
public class AuthOpsApplication {
     public static void main(String[] args) throws IOException {
        application.addListeners(new WEPFallbackListener());
        application.addListeners(new SaeListener());
        application.run(args);
        // some business logic
        log.info("logs some info of the business logic");

    }
}

我想写一个测试用例来检查www.example.com是否log.info被打印出来,它的值是否和预期的一样。我不想把业务逻辑作为一个独立的代码来测试,我想运行main函数,并以某种方式读取它输出的日志,这可能吗?
我尝试过:

import org.springframework.test.context.junit4.SpringRunner;
import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory;
import org.springframework.boot.test.autoconfigure.actuate.metrics.AutoConfigureMetrics;
import org.springframework.test.context.ActiveProfiles;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AuthOpsApplication.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
@ActiveProfiles("test")
@AutoConfigureMetrics
public class LogTest {
    TestLogger logger = TestLoggerFactory.getTestLogger(AuthOpsApplication.class);

    @Test
    public void testAnyLog() throws IOException {
        System.out.println(logger.getLoggingEvents());

    }

    @After
    public void clearLoggers() {
        TestLoggerFactory.clear();
    }
}

这将成功运行并创建所有Bean,但实际上不会调用AuthOpsApplication类的main()方法。
(我之所以这么说,是因为我所做的System.out.println()给出了除main()方法中的日志之外的所有其他日志)。
提前感谢你的帮助。

qzwqbdag

qzwqbdag1#

您的测试代码可以做到这一点:
1.应用https://stackoverflow.com/a/1119559/6944068以捕获标准输出。
1.运行里面的内容AuthOpsApplication.main()
1.收集捕获的stdout,直到看到预期的消息。
1.调用application.close()以关闭。
一些一般性建议:

  • 在调用application.run之后立即进行启动日志记录是很常见的,但严格地说,这是一种竞争条件,您不知道您所记录的业务信息何时可用。如果您将日志记录放到具有该信息的bean中,您将更加健壮。
  • 问题中给出的代码不会初始化application
  • 你不想从main()复制第2步的代码,你会想把它放到一个可以从测试代码调用的函数中。这个函数也应该返回application,这样测试代码就可以在第4步中将它close()
  • 如果你有更多的测试需要完整的应用程序,你会希望组织他们,你有应用程序启动和关闭只有一次。(我没有食谱,如何做到这将是另一个SO问题的食物。)

相关问题