繁体   English   中英

构造函数调用私有方法并返回异常时如何初始化测试实例

[英]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);
    }

这部分永远不会编译。

  1. 您声明没有类型的变量名称
  2. 你将它实例化为一个字符串
  3. 您将字符串(“Peter”)作为参数传递给需要类型名称的构造函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM