我正在为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
以便编写期望得到的期望根据我在测试课程中设置的选择值?
答案 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的一部分。所以这里没有隐藏的东西