亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 mockmvc 進行測試時無法模擬存儲庫

使用 mockmvc 進行測試時無法模擬存儲庫

蝴蝶刀刀 2023-05-24 15:59:58
我有這個非常簡單的控制器類和一個簡單的 (jpa) 存儲庫。我想要做的是測試它的 api 但模擬它的存儲庫并讓它根據測試用例返回或不返回對象。我現在的問題是我不知道該怎么做。我知道如何模擬存儲庫并將其注入控制器/服務類 @Mock / @InjectMocks / when().return()但是當我在用 MockMvc 發出請求后想做同樣的事情時,我失敗了。非常感謝任何幫助控制器import java.util.Optional;@RestController@Slf4jpublic class ReceiptController implements ReceiptsApi {    @Autowired    private ReceiptRepository receiptRepository;    @Autowired    private ErrorResponseExceptionFactory exceptionFactory;    @Autowired    private ApiErrorResponseFactory errorResponseFactory;    @Override    public Receipt getReceipt(Long id) {        Optional<ReceiptEntity> result = receiptRepository.findById(id);        if (result.isEmpty()) {            throw invalid("id");        }        ReceiptEntity receipt = result.get();        return Receipt.builder().id(receipt.getId()).purchaseId(receipt.getPurchaseId()).payload(receipt.getHtml()).build();    }    private ErrorResponseException invalid(String paramName) {        return exceptionFactory.errorResponse(                errorResponseFactory.create(HttpStatus.NOT_FOUND.value(), "NOT_VALID", String.format("receipt with id %s not found.", paramName))        );    }}而且是測試課@WebMvcTest(ReceiptController.class)@RestClientTestpublic class ReceiptControllerTest {    @InjectMocks    private ReceiptController receiptController;    @Mock    private ReceiptRepository receiptRepository;    @Mock    private ErrorResponseExceptionFactory exceptionFactory;    @Mock    private ApiErrorResponseFactory errorResponseFactory;    private MockMvc mvc;    @Before    public void setUp() {        MockitoAnnotations.initMocks(this);        mvc = MockMvcBuilders.standaloneSetup(                new ReceiptController())                      .build();    }
查看完整描述

2 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

在您的setUp()方法中,您正在使用 Mockito 來模擬帶有注釋的 bean,@Mock并將它們注入到 的新實例中ReceiptController,然后將其放入帶有注釋的字段中@InjectMocks

ReceiptController在下一行中,您將使用(您使用的)的新實例設置 MockMvc?new ReceiptController(),而不是使用 Mockito 創建的實例。這意味著該實例中的所有字段都將是null.

這幾乎可以歸結為Why is my Spring?@Autowiredfieldnull。


要解決這個問題,您可以傳遞receiptController給 MockMvc。在這種情況下,您還可以刪除@WebMvcTest@RestClientTest因為您不使用它們。

或者,您可以使用 設置測試,并通過使用in stead of和in stead of@RunWith(SpringRunner.class)正確設置 Spring 測試。在這種情況下,您根本不需要方法,因為 MockMvc 可以由 Spring 自動裝配。@Autowired@InjectMocks@MockBean@MocksetUp()


查看完整回答
反對 回復 2023-05-24
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

允許您進行集成測試,而不是單元測試。

它們允許您啟動實際的 Spring 應用程序(使用隨機端口)并測試實際的控制器類及其依賴項。這意味著您在測試頂部聲明的變量實際上并未在當前設置中使用。

如果你想對你的控制器進行單元測試,你可以刪除@WebMvcTest,創建模擬依賴項(就像你所做的那樣)并直接調用你的方法而不是使用 MockMvc。

如果你真的想寫一個集成測試,你需要模擬你的外部依賴(例如數據庫)。你可以配置spring在測試環境中使用嵌入式數據庫(例如H2),這樣就不會影響你的真實數據庫。

查看完整回答
反對 回復 2023-05-24
  • 2 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號