班级的模拟构造函数



我正在为我的Java类编写测试课。我正在使用Mockito。

我正在使用与Power Mockito不兼容的Junit5,因此我仅使用Mockito。

i具有具有函数 findSalaryclass Emp,如下所示, EmpProfileClient在构造函数上初始化。

Class Emp {
......
  public void findSalary(empId) {
    ...
    TaxReturn taxReturn = new TaxReturn(EmpProfileClient);
    int value = taxReturn.apply(new TaxReturnRequest.withEmpId(empId))
                    .returnInRupee();
    ...
  }
}

当我编写测试案例时,我嘲笑了EmpProfileClient,但是由于我们在方法中创建TaxReturn,所以我如何模拟TaxReturn.apply,以便我可以根据我在测试中设置的选择来编写获得值的期望班级?

如果要模拟此内容,则TaxReturn类应该是Emp类中的注射bean。添加注入框架(如弹簧(并注入TaxReturn类。在测试中,您可以注入模拟而不是真实类。请参阅Mockito框架的@InjectMocks注释。

如果我正确理解您的问题(您正在寻找嘲笑taxReturn.apply(,我建议下一步:

首先。重构您的税收量

public class EmpService {
 public int findSalary(Integer empId) {
  //...
  // It's doesn't matter what the actual empProfileClient type is
  // as you mocking creation behavior anyway  
  Object empProfileClient = null;
  TaxReturn taxReturn = createClient(empProfileClient);   
  int value = taxReturn.apply(new TaxReturnRequest().withEmpId(empId))
   .returnInRupee();
  //...
  return value; // or whatever 
 }
 protected TaxReturn createClient(Object empProfileClient) {
  return new TaxReturn(empProfileClient);
 }
}

第二。在您的测试中使用 mockito.spy((

class EmpServiceTest {
  @Test
  void findSalary() {
    TaxReturn taxReturn = Mockito.mock(TaxReturn.class);
    // this is the main idea, here you using partial EmpService mock instance
    // part is mocked(createClient()) and other part(findSalary()) is tested
    EmpService service = Mockito.spy(EmpService.class);
    when(service.createClient(any())).thenReturn(taxReturn);
    when(taxReturn.apply(any(TaxReturnRequest.class))).thenReturn(taxReturn);
    int yourExpectedValue = 5;
    when(taxReturn.returnInRupee()).thenReturn(yourExpectedValue);
    assertEquals(yourExpectedValue, service.findSalary(0));
  }
}

请记住, any((,spy((,当(( mock((方法是Mockito API的一部分。所以这里没有隐藏的东西

相关内容

  • 没有找到相关文章

最新更新