我正在为我的Java类编写测试课。我正在使用Mockito。
我正在使用与Power Mockito不兼容的Junit5,因此我仅使用Mockito。
i具有具有函数 findSalary
的 class 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
(,我建议下一步:
首先。重构您的税收量 第二。在您的测试中使用 mockito.spy((: 请记住, any((,spy((,当((和 mock((方法是Mockito API的一部分。所以这里没有隐藏的东西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);
}
}
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));
}
}