2 回答

TA貢獻1799條經驗 獲得超6個贊
在您的setUp()
方法中,您正在使用 Mockito 來模擬帶有注釋的 bean,@Mock
并將它們注入到 的新實例中ReceiptController
,然后將其放入帶有注釋的字段中@InjectMocks
。
ReceiptController
在下一行中,您將使用(您使用的)的新實例設置 MockMvc?new ReceiptController()
,而不是使用 Mockito 創建的實例。這意味著該實例中的所有字段都將是null
.
這幾乎可以歸結為Why is my Spring?@Autowired
fieldnull
。
要解決這個問題,您可以傳遞receiptController
給 MockMvc。在這種情況下,您還可以刪除@WebMvcTest
和@RestClientTest
因為您不使用它們。
或者,您可以使用 設置測試,并通過使用in stead of和in stead of@RunWith(SpringRunner.class)
正確設置 Spring 測試。在這種情況下,您根本不需要方法,因為 MockMvc 可以由 Spring 自動裝配。@Autowired
@InjectMocks
@MockBean
@Mock
setUp()

TA貢獻1852條經驗 獲得超1個贊
允許您進行集成測試,而不是單元測試。
它們允許您啟動實際的 Spring 應用程序(使用隨機端口)并測試實際的控制器類及其依賴項。這意味著您在測試頂部聲明的變量實際上并未在當前設置中使用。
如果你想對你的控制器進行單元測試,你可以刪除@WebMvcTest,創建模擬依賴項(就像你所做的那樣)并直接調用你的方法而不是使用 MockMvc。
如果你真的想寫一個集成測試,你需要模擬你的外部依賴(例如數據庫)。你可以配置spring在測試環境中使用嵌入式數據庫(例如H2),這樣就不會影響你的真實數據庫。
添加回答
舉報