簡體   English   中英

Spring 引導 - 如何從具有注入依賴項的依賴模塊初始化 class

[英]Spring Boot - how to initialize class from a dependent module with injected dependencies

我有兩個 Maven 項目 A 和 B,其中項目 B 嵌套在項目 A 中。結構如下所示:

Project A:
    src/test/java:
        MyTest.java
    Project B:
        src/test/java:
            MyNewTest.java
        pom.xml
    pom.xml

我的目標是讓 MyNewTest.java 充當 MyTest.java 的包裝器,並能夠從 MyNewTest.java 調用 MyTest.java 中聲明的測試方法。 MyTest 有一些注入的依賴項。

我的問題是:如何在 MyNewTest 中初始化 MyTest 以確保正確注入 MyTest 的所有依賴項?

MyTest 如下所示:

public class MyTest {
    
    @Autowired
    Service service; 

    @Autowired
    TestUtil util;

    Info info;
    
    @PostConstruct
    void init() {
        info = service.getStuff();
    }

    @Test
    public test1() {
        service.getMoreStuff();
        // more code omitted
    }
     
}

我嘗試將@Component 添加到 MyTest,然后在 MyNewTest.java 中,使用 @Autowired,如下所示:

public class MyNewTest {

    @Autowired
    private MyTest baseTest;

    @Test
    public void runTest() {
        // run the test in MyTest.java
        baseTest.test1();
    }
}

但這似乎不起作用 - baseTest 是 null。我也嘗試通過調用其默認構造函數來初始化 MyTest,但未能按預期注入依賴項。 誰能建議一種正確的方法來初始化 MyTest.java 以便它的所有依賴項也被注入? 謝謝

您測試的問題是 @Autowired 注釋,因為未觸發 Spring 接線。 您可以采用兩種不同的方法來解決此問題。

第一個選項是在MyNewTest中手動實例化baseTest ,此時它不再是 null。但是,測試仍然會失敗,因為您的兩個 @Autowired 依賴項將是 null。您可以添加 setter 或通過構造函數注入它們。 注意——如果你正在執行單元測試,這些類應該被模擬。 如果您選擇通過構造函數添加這些類,它的外觀如下 -

     private Service service;
     private TestUtil util;
     private MyTest baseTest;

     @BeforeEach
     void setUp() {
          service = mock(Service.class);
          util = mock(TestUtil.class);
          baseTest = new MyTest(service, util);
     }

第二個選項是將配置添加到您的測試 class 以支持 Spring 接線。 我不熟悉這條路線,因為我總是盡可能選擇第一個選項。 有多種方法可以添加 Spring 接線,但最簡單的方法是 -

@SpringBootTest
@RunWith(SpringRunner.class)
public class MyNewTest {

但是,這並未涵蓋所有用例,因此您可能需要更具體的配置。 您可以在此處找到一些可能的選項 - How to write JUnit test with Spring Autowire?

編輯-當我立即意識到一個問題時,我沒有非常仔細地閱讀 rest 並且我錯過了這些是您試圖連接在一起的測試類。 我不確定這是否可能。

只有 Spring bean 可以是@Autowired,所以第一步是嘗試添加配置,使您的測試 class 成為 Spring bean。 我以前從未聽說過這樣做,但嘗試起來很容易。 如果沒有,您可以使用第一個選項來解決此問題。

第二個問題是工件中沒有包含測試。 我想您可以通過將測試課程與常規課程混合來規避這個問題,但這被認為是一種不好的做法。 我從未聽說過測試依賴於其他測試,但我猜這也是一種不好的做法。 想要以這種方式創建測試的原因是什么?

暫無
暫無

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

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