[英]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.