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

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

如何編寫非封裝的單元測試?

如何編寫非封裝的單元測試?

森欄 2022-09-22 15:50:38
我有一個自動連線變量@Autowiredprivate DocumentConfig documentConfig;我想使用此配置對象的各種狀態對文檔服務進行測試。我有哪些選擇?什么是最好的選擇?第一個想法是這樣的:@Testpublic void save_failure() {    documentConfig.setNameRequired(true);    /*    testing code goes here    */    documentConfig.setNameRequired(false);}但我想更確定變量在測試后重置,以免干擾其他測試,以確保只有此測試在出現問題時出錯。我的新想法是這樣的:@Beforepublic void after() { documentConfig.setNameRequired(true); }@Testpublic void save_failure() {    /*    testing code goes here    */}@Afterpublic void after() { documentConfig.setNameRequired(false); }但是,這根本不起作用,因為“之前”和“之后”對整個文件執行,而不是對單個測試執行。我寧愿不僅僅為了一個測試而制作一個新文件。我現在已經達成了妥協:@Testpublic void save_failure() {    documentConfig.setNameRequired(true);    /*    testing code goes here    */}@Afterpublic void after() { documentConfig.setNameRequired(false); }它似乎做了我想做的一切,但我有幾個問題。假設開始時為假,這是否保證不會干擾其他測試?有什么辦法可以更清楚地說明這一點嗎?無論是為了我未來的自己,也是為了他人。nameRequired
查看完整描述

3 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

您可以在每次測試之前創建它。像


private DocumentConfig documentConfig;


@Before

public void createConfig() {

    documentConfig = new DocumentConfig(mockedParams);

}


查看完整回答
反對 回復 2022-09-22
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

一種常用的方法是設置一個虛擬用戶并將其注入到方法中(用 注釋),以便在每個測試中重置整個上下文,例如:DocumentConfigsetUp()@Before


@Before

public void setUp() {

    this.documentConfig = new DocumentConfig();

    this.documentConfig.setNameRequired(false);

    this.service = new DocumentService(this.documentConfig);

}

在本例中,我設置了一個帶有 be 的簡單對象。我可能會刪除該語句,因為無論如何都會默認為。nameRequiredfalsebooleanfalse


如果不使用構造函數注入,并且沒有 的 setter,則必須使用反射來注入字段,例如:documentConfig


ReflectionTestUtils.setField(this.service, "documentConfig", this.documentConfig);

在你的測試中,你現在可以寫這樣的東西:


@Test

public void save_failure() {

    this.documentConfig.setNameRequired(true);

    // TODO: Implement test

}

或者,您可以模擬 ,這樣您就不依賴于其實現來測試 。我假設您正在調用 代碼中的某個位置,因此您可以像這樣模擬它:DocumentConfigDocumentServiceisNameRequired()DocumentService


@Before

public void setUp() {

    // Use a static import for Mockito.mock()

    this.documentConfig = mock(DocumentConfig.class);

    this.service = new DocumentService(this.documentConfig);

}


@Test

public void save_failure()  {

    // Use a static import for Mockito.when()

    when(this.documentConfig.isNameRequired()).thenReturn(true); 

    // TODO: Implement test

}

由于這種模擬/注射設置經常發生,Mockito也有自己的運行器,可以讓你擺脫這種方法,例如:setUp()


@RunWith(MockitoJUnitRunner.class)

public class DocumentServiceTest {

    @InjectMocks

    private DocumentService documentService;

    @Mock

    private DocumentConfig documentConfig;


    @Test

    public void save_failure()  {

        when(this.documentConfig.isNameRequired()).thenReturn(true); 

        // TODO: Implement test

    }

}


查看完整回答
反對 回復 2022-09-22
?
哈士奇WWW

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

目前尚不清楚您使用的測試框架。對于普通單元測試,使值可通過 setter 或構造函數注入來注入。任何最適合您的特定情況的東西。

如果要注入大量(超過三個 ;-) 此類值,則可以考慮引入一個配置類,將所有這些值作為單個參數注入。


查看完整回答
反對 回復 2022-09-22
  • 3 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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