[英]How to initialize instance for test, when constructor call private method and return exception
就我而言,Student.java
public class Student{
private String studentId;
public Student(String name){
super(name);
setId();
range();
}
private void range() throw Exception{
final studentDetails = Loader.load(studentId);
}
private void setId(){
final studentId = "123";
}
public void getAge(){};
}
Loader.load 调用读取属性文件并抛出文件不存在异常。在这种情况下 Loader.load 方法是静态的。
当我写单元测试时,
学生测试.java
public class StudentTest{
private Student student;
private String name;
@BeforeMethod
public void setUp() throws Exception{
MockitoAnnotations.initMocks(this);
name = "Peter";
student = new Student(name);
}
@Test
public void testGetAge(){
}
}
在这种情况下,在setUp()
中 throw file not found 异常。 我正在使用 TestNG、Java 8、Mockito。 我该如何解决这个问题。 有没有办法在它初始化测试类时跳过构造函数调用range()
方法? 我的项目不使用 PowerMockito。 请考虑提供的代码是我真正问题的示例。
这里的主要问题是违反单一职责模式(SRP) 以及强大的构造函数代码气味和对依赖项的静态访问。
您可以放弃糟糕的设计并通过使用
PowerMock
模拟对Loader.load()
的静态访问来解决您的问题,但更好的方法是在创建Student
对象并传递它之前为Student
的成员变量准备值(有效) 值直接作为构造函数参数。
您是否尝试过在 Mockito 中使用Spy
。 使用Spy
您可以为特定方法添加自定义行为。
但是,AFAIK 您可能必须在范围方法上将private
更改为至少protected
。
private Student student;
private name;
@BeforeMethod
public void setUp() throws Exception{
MockitoAnnotations.initMocks(this);
name = "Peter";
student = new Student(name);
}
这部分永远不会编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.