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

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

我需要模擬函數(shù),但它不起作用,如何在不修改 src 代碼的情況下構(gòu)建單元測試?

我需要模擬函數(shù),但它不起作用,如何在不修改 src 代碼的情況下構(gòu)建單元測試?

阿晨1998 2021-11-11 13:30:15
這是我要測試的功能:@Componentpublic class DataSourceAttributes {    ...    ...    public AWSSecretDB getAttribsBySecret() throws Exception {        AbstractConnector abstractConnector = new AWSSecretManagerConnector("secretsmanager." + region + ".amazonaws.com", region);        GenericManager genericManager = new GenericManager(abstractConnector);        System.out.println("Generic Manager: " + genericManager);        AWSSecretDB awsSecretDB;        try {            awsSecretDB = genericManager.getSecretModel(secretName, AWSSecretDB.class);            System.out.println("awsSecretDB: " + awsSecretDB.getEngine()); // It must be mocked        } catch (Exception e) {            LOGGER.error(e.getMessage(), e);            throw e;        }        return awsSecretDB;    }}這是我當(dāng)前的單元測試:public class DataSourceAttributesTest {    @InjectMocks    private DataSourceAttributes dataSourceAttributes;    @Mock    private GenericManager genericManagerMock;    @Test    public void AWSSecretDBGetAttribsBySecret() throws Exception {        AWSSecretDB awsSecretDB = new AWSSecretDB();        awsSecretDB.setEngine("Engine Test");        awsSecretDB.setDbname("DB Test");        awsSecretDB.setHost("Host Test");        when(genericManagerMock.getSecretModel(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(awsSecretDB);        dataSourceAttributes.getAttribsBySecret();        // The assert is missing, but it's not important for this question    }}我需要模擬genericManager來控制getSecretModel()函數(shù),但它不起作用。當(dāng)我運(yùn)行我的測試時(shí),System.out.println(位于 getAttribsBySecret 中)打印出以下消息,證明模擬不起作用:Generic Manager: co.com.bancolombia.commons.secretsmanager.manager.GenericManager@1349883我知道如果我使用以下代碼,模擬效果很好,但我不想重新編碼它已經(jīng)在 src 目錄中工作的東西:當(dāng)我運(yùn)行測試時(shí),System.out.println(位于 getAttribsBySecret 中)打?。篏ENERIC MANAGER: genericManagerMockawsSecretDB: Engine Test它如何顯示,模擬效果很好。所以,這是我的問題:如何在類中使用模擬并避免在主代碼中聲明新屬性和構(gòu)造函數(shù)。我問這個(gè)是因?yàn)榈谝粋€(gè)代碼有效,我不想編輯它,我認(rèn)為這不是單元測試的精髓。
查看完整描述

2 回答

?
動(dòng)漫人物

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

要使用單元測試,您首先需要使代碼可測試。這可能需要一些代碼更改。無法在方法內(nèi)部模擬局部變量,因此您需要將這些變量作為參數(shù)傳遞給方法,或者在對象內(nèi)部創(chuàng)建屬性并將模擬對象傳遞給構(gòu)造函數(shù)。


@Component

public class DataSourceAttributes {

  private AbstractConnector abstractConnector;

  private GenericManager genericManager;


  @Autowired // to ask Spring to inject dependencies

  public DataSourceAttributes(AbstractConnector abstractConnector, GenericManager genericManager) {

    this.abstractConnector = abstractConnector;

    this.genericManager = genericManager;

  }


  public AWSSecretDB getAttribsBySecret() throws Exception {

    System.out.println("Generic Manager: " + genericManager);


    AWSSecretDB awsSecretDB;

    try {

        awsSecretDB = genericManager.getSecretModel(secretName, AWSSecretDB.class);

        System.out.println("awsSecretDB: " + awsSecretDB.getEngine()); // It must be mocked

    } catch (Exception e) {

        LOGGER.error(e.getMessage(), e);

        throw e;

    }

    return awsSecretDB;

 }

}

然后在測試中創(chuàng)建對象的實(shí)例,將模擬依賴項(xiàng)傳遞給構(gòu)造函數(shù)


查看完整回答
反對 回復(fù) 2021-11-11
?
慕蓋茨4494581

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

如果您知道代碼有效,那么首先為什么要對其進(jìn)行單元測試?或者,如果您不打算更改源來修復(fù)它,為什么要執(zhí)行可能帶來錯(cuò)誤的活動(dòng)?

但是,更嚴(yán)重的是,您似乎陷入了“遺留代碼困境”:要修改代碼,您寧愿進(jìn)行適當(dāng)?shù)臏y試。要進(jìn)行測試,您必須修改代碼。

對此的逃避是從剛好足以創(chuàng)建您需要的那些測試的微創(chuàng)更改開始。由于這是一種遷移方法,有時(shí)甚至可以接受一些骯臟的技巧來克服困境。Michael Feathers 在“有效處理遺留代碼”中詳細(xì)討論了這一點(diǎn),并提供了許多實(shí)用建議。

在像 Java 這樣具有自省功能的語言中,有時(shí)自省可以成為一個(gè)解決方案,以實(shí)現(xiàn)更好的可測試解決方案。然而,這屬于骯臟的伎倆,除了作為遷移到更好解決方案的一種方式之外,我認(rèn)為這是不可取的。


查看完整回答
反對 回復(fù) 2021-11-11
  • 2 回答
  • 0 關(guān)注
  • 205 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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