第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 mockmvc 進(jìn)行測(cè)試時(shí)無(wú)法模擬存儲(chǔ)庫(kù)

使用 mockmvc 進(jìn)行測(cè)試時(shí)無(wú)法模擬存儲(chǔ)庫(kù)

蝴蝶刀刀 2023-05-24 15:59:58
我有這個(gè)非常簡(jiǎn)單的控制器類和一個(gè)簡(jiǎn)單的 (jpa) 存儲(chǔ)庫(kù)。我想要做的是測(cè)試它的 api 但模擬它的存儲(chǔ)庫(kù)并讓它根據(jù)測(cè)試用例返回或不返回對(duì)象。我現(xiàn)在的問題是我不知道該怎么做。我知道如何模擬存儲(chǔ)庫(kù)并將其注入控制器/服務(wù)類 @Mock / @InjectMocks / when().return()但是當(dāng)我在用 MockMvc 發(fā)出請(qǐng)求后想做同樣的事情時(shí),我失敗了。非常感謝任何幫助控制器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))        );    }}而且是測(cè)試課@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貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

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

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


要解決這個(gè)問題,您可以傳遞receiptController給 MockMvc。在這種情況下,您還可以刪除@WebMvcTest@RestClientTest因?yàn)槟皇褂盟鼈儭?/p>

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


查看完整回答
反對(duì) 回復(fù) 2023-05-24
?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊

允許您進(jìn)行集成測(cè)試,而不是單元測(cè)試。

它們?cè)试S您啟動(dòng)實(shí)際的 Spring 應(yīng)用程序(使用隨機(jī)端口)并測(cè)試實(shí)際的控制器類及其依賴項(xiàng)。這意味著您在測(cè)試頂部聲明的變量實(shí)際上并未在當(dāng)前設(shè)置中使用。

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

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

查看完整回答
反對(duì) 回復(fù) 2023-05-24
  • 2 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)