簡體   English   中英

測試 Spring boot 使用 Junit 啟動應用程序

[英]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() 方法中的日志)。

在此先感謝您的幫助。

您的測試代碼可以這樣做:

  1. 應用https://stackoverflow.com/a/1119559/6944068捕獲標准輸出。
  2. 運行AuthOpsApplication.main()中的內容。
  3. 收集捕獲的標准輸出,直到您看到預期的消息。
  4. 調用application.close()關閉。

一些一般性建議:

  • 在調用application.run之后立即進行啟動日志記錄是很常見的,但嚴格來說這是一個競爭條件,您不知道您正在記錄的業務信息何時可用。 如果您將日志記錄放入具有該信息的 bean 中,您將更加健壯。
  • 問題中給出的代碼不會初始化application
  • 您不想從main()復制步驟 2 的代碼,您需要將其放入可以從測試代碼調用的 function 中。 function 也應該返回application ,以便測試代碼可以在步驟 4 中close()它。
  • 如果您有更多需要完整應用程序的測試,您將希望將它們組織為您只啟動和關閉應用程序一次。 (我沒有這方面的食譜,如何做到這一點將是另一個 SO 問題的食物。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM