我是 Spring 的新手,并試圖通過一個簡單的測驗來實作 Spring Retry。但是我不能讓它作業,希望有人能告訴我我做錯了什么。另外我想知道,是否可以撰寫單元測驗來驗證 Spring Retry 是否嘗試了請求的最大重試次數?因為離谷歌搜索太遠了,它似乎只能在集成測驗中作業,因為它需要先設定背景關系。
這是我的主要課程:
@SpringBootApplication
public class SpringtestApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(SpringtestApplication.class).run(args);
}
}
配置類
@Configuration
@EnableRetry
public class FakeConfiguration implements ApplicationRunner {
private final FakeParser fakeParser;
public FakeConfiguration(FakeParser fakeParser) {
this.fakeParser = fakeParser;
}
@Override
public void run(ApplicationArguments args) {
this.runParser();
}
@Retryable(maxAttempts = 5, value = RuntimeException.class)
public void runParser() {
fakeParser.add();
}
}
組件/服務類:
@Component
public class FakeParser {
public int add(){
int result = 113;
return result;
}
}
它的重試測驗:
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringtestApplicationTests {
@Autowired
private FakeConfiguration fakeConfiguration;
@MockBean
private FakeParser fakeParser;
@Test
public void retry5times(){
when(fakeParser.add()).thenThrow(RuntimeException.class);
try {
fakeConfiguration.runParser();
} catch (RuntimeException e){
}
verify(fakeParser, times(5)).add();
}
}
然而,測驗沒有通過:
org.mockito.exceptions.verification.TooManyActualInvocations:
fakeParser bean.add();
Wanted 5 times:
-> at com.example.springtest.SpringtestApplicationTests.retry5times(SpringtestApplicationTests.java:43)
But was 6 times:
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
-> at com.example.springtest.FakeConfiguration.runParser(FakeConfiguration.java:26)
uj5u.com熱心網友回復:
when(someObject.someMethod())評估該方法并對其進行真正的呼叫。這就是為什么你總是比想要的多一個呼叫。
如果您需要計算實際呼叫次數,您可以將其添加1到您的verify,但這是不推薦(也不需要)的丑陋解決方法。或者您可以使用Mockito.doXXX沒有該問題的方法。
在你的情況下,你可以嘗試
doThrow(new RuntimeException()).when(fakeParser).add();
這應該最終為您提供正確的呼叫量。注意when這里用法的區別:(when(fakeParser).add()兩種方法鏈接在一起)與when(fakeParser.add())(只有一種方法)
uj5u.com熱心網友回復:
很可能你嘗試
Mockito.verify(fakeParser,times(5)).add(Mockito.any());
您應該考慮第一次運行,因為當您重試 5 次并再次運行時。即使您重試 5 次,它也應該運行 6 次。
您忘記了第一個例外情況,這是正常的運行行為
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/377255.html
下一篇:“錯誤無法找到瀏覽器。“saucelabs:[email protected]:Windows10”不是瀏覽器別名或可執行檔案的路徑
