当前位置: 首页 > 知识库问答 >
问题:

Mockito Thread.class尝试捕获块中的异常不会提高覆盖率

胡野
2023-03-14

我正在尝试用线程在try-catch块中测试异常。使用Mocito在try block中使用sleep方法。我使用了下面的mockito测试方法,它按预期通过了测试,但从未提高我的测试覆盖率。coverage报告显示waitForSync方法中的catch块从未到达。有人能帮我吗我在这里错过了什么?

public class CreateAccount{
@Autowired
private AccountService accountService,

@Autowired
private BuildAccountResponse buildAccountResponse

 @Value("${waitForSync:0}")
  private Integer accountSyncWaitTimeMs;

public AccountResponse createMyAccount(AccountRequest request, String accountId) {

    accountService.checkIfAccountExists(accountId);

   Optional<AccountResponse> myResponse= buildAccountResponse.create(request, accountId);

   waitForSync(accountId);

   return myResponse.get();
}
}

WaitForSync方法

private void waitForSync(String accountId) {
try{
if (accountSyncWaitTimeMs>0){
Thread.sleep(accountSyncWaitTimeMs)
}
catch { (Exception e)       
Logger.warn("Failed to apply wait account sync");   

}

我的mockito测试方法

@InjectMocks
@Spy
private CreateAccount createAccount;

private static final accountWaitTime = 1;

ReflectionTestUtils.setField(createAccount, "accountSyncWaitTimeMs" , accountWaitTime);

private AccountRequest request;

private static final String accountId = "AccountId";

@Test (expected = Exception.class)
public void createAccount_waiSync_Exception () {

 doThrow(new InterruptedException()).when(Thread.class);

createAcccount.createMyAccount(request, accountId);
}

测试按预期通过,但线下的测试从未覆盖,所以基本上我在覆盖率方面增加了测试,所以应该如何改进它?

catch { (Exception e)       
Logger.warn("Failed to apply wait account sync"); 

共有1个答案

孙京
2023-03-14

你可以在Mocktio之上使用PowerMocktio,你可以检查Mocktio的新版本,他们promise会在mocking静态方法上做一些改进

@RunWith(PowerMockRunner.class)
@PrepareForTest(Thread.class)
public class ExampleTest{

    @InjectMocks
    @Spy
    private CreateAccount createAccount;
    private static final accountWaitTime = 1;
    ReflectionTestUtils.setField(createAccount, "accountSyncWaitTimeMs" , accountWaitTime);

    private AccountRequest request;
    private static final String accountId = "AccountId";

  @Test (expected = Exception.class)
  public void createAccount_waiSync_Exception () {
    PowerMockito.mockStatic(Thread.class);
    PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
    Thread.sleep(anyLong()); // or set the value you want

    createAcccount.createMyAccount(request, accountId);
  }

}
 类似资料:
  • 我已经为以下函数编写了Junit测试用例。当检查JACOCO测试覆盖率时。它显示测试用例只覆盖了try块。我是编写测试用例的新手。如何在测试用例中覆盖异常和catch块 这里有一个方法 和测试方法

  • 我试图在下面的代码中覆盖catch块,但我无法。我知道在读/写文件时需要引起IOException,但我不能这样做。而且,我不能使用PowerMockito来覆盖静态方法,因为我使用的是JUnit5。有人能帮忙吗? 这是我编写的一个测试用例,但它返回了这个错误-org.mockito.exceptions.Misusing.MissingMethodInvocationException:when

  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到

  • 问题内容: 我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚 这似乎是使用异步/等待解决/拒绝或返回/抛出的唯一可能性,但是,v8不会在try / catch块中优化代码吗? 有其他选择吗? 问题答案: 备择方案 替代方法: 显式地使用诺言将是这样的: 或类似的东西,使用延续传递样式: 原始例子 您的原始代码所做的是暂停执行并等待由其返回的诺言解决。然后,它继续执行,并将返回的值写入,如果承

  • 有可能在SWIFT中捕捉异常吗?给定以下代码: 有可能防止异常使整个程序崩溃吗?也就是说,在Objective-C中,与以下内容相对应的Swift等价是什么: