![](/img/trans.png)
[英]Using junit test to pass command line argument to Spring Boot application
[英]Test Spring boot Application startup using Junit
我有一些在 Spring 啟動應用程序啟動時運行的業務邏輯(即在 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");
}
}
我想編寫一個測試用例來檢查 log.info 是否被打印並且它的值是否符合預期。 我不想將業務邏輯作為獨立代碼進行測試,我想運行主 function 並以某種方式讀取它輸出的日志,這可能嗎?
我嘗試了什么:
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 class 的 main() 方法。
(我可以這樣說,因為我所做的 System.out.println() 提供了所有其他日志,除了 main() 方法中的日志)。
在此先感謝您的幫助。
您的測試代碼可以這樣做:
AuthOpsApplication.main()
中的內容。application.close()
關閉。一些一般性建議:
application.run
之后立即進行啟動日志記錄是很常見的,但嚴格來說這是一個競爭條件,您不知道您正在記錄的業務信息何時可用。 如果您將日志記錄放入具有該信息的 bean 中,您將更加健壯。application
。main()
復制步驟 2 的代碼,您需要將其放入可以從測試代碼調用的 function 中。 function 也應該返回application
,以便測試代碼可以在步驟 4 中close()
它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.