簡體   English   中英

單元測試-測試@Retryable和@Recover的問題

[英]Unit test - Problems testing @Retryable and @Recover

我有一個使用@Retryable批注的組件,另一個使用該組件的服務。 因此,我試圖測試使用@Retryable批注的組件是否正在重試。

我已經嘗試了網絡上目前存在的所有解決方案,但對我沒有任何幫助。 我正在嘗試為此創建單元測試,而不是集成測試。 到目前為止,我已經設法解決了應該拋出的異常,並且@Retryable甚至沒有重試,該方法只是拋出了異常,僅此而已。

這是使用Retryable批注的組件:

@Component
public class OurComponent {

    @Retryable(maxAttempts = 10,
            backoff = @Backoff(delay = 2000),
            value = {someException.class}
    )
    public void someMethod(SomeObject someObject) throws someException {
        Object createObject = anotherMethod(someObject); //this method throws someException
        ...
    }
}

以及使用此ourComponent的服務:

@Service
public class someService {

    private final OurComponent ourComponent;

    public SomeService(OurComponent ourComponent) {
         this.ourComponent = ourComponent;
    }

    ...


    public void methodUsingComponent() {
         SomeObject someObject = new SomeObject(args);
         ourComponent.someMethod(someObject);
    }
}

現在,我嘗試使用@InjectMocks和@MockBean這個服務和組件,但是仍然無法正常工作。 甚至不進行集成測試就可以測試@Retryable注釋嗎?

如果您使用根本不使用spring的單元測試,則將無法輕松對其進行測試。

這是由於這樣的事實,Spring會識別出這樣的注釋,並且相應的bean被運行時生成的代理包裝,該代理實現了“重試”邏輯。

現在,如果您沒有觸發所有此機制的spring,則此@Retryable注釋基本上是無用的,mockito對此一無所知,Junit也不知道。

您可以嘗試手動創建一個這樣的代理(檢查spring-retry調用的邏輯),但這看起來有些過頭了。 坦白說,它什么也沒給你。 單元測試應該檢查代碼的功能,而不是檢查彈簧重試背后由其他地方實現並經過測試的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM