Mockito 更改 return 方法的值
Mockito change return value of a method
在测试中 class 尝试更改方法调用的结果 return。
在测试方法 1 时从测试 class 调用 isExistStudentInList(...) 时尝试 return true。
尝试了下面的方法,但它实际上是在执行方法而不是 returning 真实值。
关于如何做到这一点有什么建议吗?
public class School {
public static void main(String[] s) {
..........
}
public void method1(List<Students> lstStudents) {
int ilCounter = 0;
.....
while(rs.next()) {
ilCounter++;
Students voObj = new Students();
voObj.setName(rs.getString(1));
voObj.setDepartment(rs.getString(2));
.....
boolean existStu = isExistStudentInList(lstStudents, voObj);
if(elementId == 0 && existStu) {
ilCounter--;
.....
}
}
}
public boolean isExistStudentInList(List<Students> lstJobElements, Students voObj) {
boolean checkStudent;
.........
return checkStudent;
}
}
public class SchoolTest {
@InjectMocks
School school;
.....
@Before
public void setUp() {
........
}
@Test
public void testMethod1() throws SQLException {
........
when(school.isExistStudentInList(getSampleDataForStudents(), (Students)getSampleDataForStudents().get(0))).thenReturn(true);
school.method1(getSampleDataForStudents());
....
}
private List<Students> getSampleDataForStudents() {
List<Students> lstStudents = new ArrayList<Students>();
Students student1 = new Students();
student1 .setName("aaaa");
student1 .setDepartment("1222");
.....
Students student2 = new Students();
student1 .setName("bbbb");
student1 .setDepartment("1222");
.....
lstStudents.add(student1);
lstStudents.add(student2);
return lstStudents;
}
}
您正在使用创建 class 实例的 @InjectMocks 并注入使用 @Mock
或 @Spy
创建的模拟。但是 School
既不是模拟也不是间谍。因此,当您调用 when()
时,您的代码没有抛出任何异常,我感到很惊讶。
你可以通过让学校成为间谍来完成你想要做的事情。这将允许调用底层方法,除非它们被存根。
School school = Mockito.spy(new School());
但是,我认为您真的应该改变测试代码的方式或抽象一些实现,因为您不必模拟/监视正在测试的 class。
在测试中 class 尝试更改方法调用的结果 return。
在测试方法 1 时从测试 class 调用 isExistStudentInList(...) 时尝试 return true。
尝试了下面的方法,但它实际上是在执行方法而不是 returning 真实值。
关于如何做到这一点有什么建议吗?
public class School {
public static void main(String[] s) {
..........
}
public void method1(List<Students> lstStudents) {
int ilCounter = 0;
.....
while(rs.next()) {
ilCounter++;
Students voObj = new Students();
voObj.setName(rs.getString(1));
voObj.setDepartment(rs.getString(2));
.....
boolean existStu = isExistStudentInList(lstStudents, voObj);
if(elementId == 0 && existStu) {
ilCounter--;
.....
}
}
}
public boolean isExistStudentInList(List<Students> lstJobElements, Students voObj) {
boolean checkStudent;
.........
return checkStudent;
}
}
public class SchoolTest {
@InjectMocks
School school;
.....
@Before
public void setUp() {
........
}
@Test
public void testMethod1() throws SQLException {
........
when(school.isExistStudentInList(getSampleDataForStudents(), (Students)getSampleDataForStudents().get(0))).thenReturn(true);
school.method1(getSampleDataForStudents());
....
}
private List<Students> getSampleDataForStudents() {
List<Students> lstStudents = new ArrayList<Students>();
Students student1 = new Students();
student1 .setName("aaaa");
student1 .setDepartment("1222");
.....
Students student2 = new Students();
student1 .setName("bbbb");
student1 .setDepartment("1222");
.....
lstStudents.add(student1);
lstStudents.add(student2);
return lstStudents;
}
}
您正在使用创建 class 实例的 @InjectMocks 并注入使用 @Mock
或 @Spy
创建的模拟。但是 School
既不是模拟也不是间谍。因此,当您调用 when()
时,您的代码没有抛出任何异常,我感到很惊讶。
你可以通过让学校成为间谍来完成你想要做的事情。这将允许调用底层方法,除非它们被存根。
School school = Mockito.spy(new School());
但是,我认为您真的应该改变测试代码的方式或抽象一些实现,因为您不必模拟/监视正在测试的 class。