我有一些业务逻辑在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()方法中的日志之外的所有其他日志)。
提前感谢你的帮助。
1条答案
按热度按时间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()
。