类的模拟构造函数

时间:2019-05-22 05:16:37

标签: mockito junit5

我正在为Java类编写测试类。我正在将Junit5与Mockito一起使用。

我正在使用与Power Mockito不兼容的Junit5,所以我只在使用Mockito。

我有class Emp,其功能类似于以下的findSalary,并且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以便编写期望得到的期望根据我在测试课程中设置的选择值?

2 个答案:

答案 0 :(得分:0)

如果要对此进行模拟,则TaxReturn类应该是Emp类中的注入bean。添加一个注入框架(如Spring)并注入TaxReturn类。在编写的测试中,您可以注入Mock而不是真实的类。请参见嘲笑框架的@InjectMocks批注。

答案 1 :(得分:0)

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

第一。重构您的 taxReturn 实例化(因为与尝试模拟局部变量相比,模拟方法行为要容易得多)

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(),when() mock()方法是Mockito API的一部分。所以这里没有隐藏的东西