Java单元测试模拟,目标类new()方法需要依赖性模拟

2guxujil  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(170)

我想测试A类。
在A类构造函数方法中,创建了一个私有的final依赖项d。我想模拟d。下面是代码

public class A {
    public A () throws FileNotFoundException {}
    private final D d = new D();
}

public class D { 
    public D () throws FileNotFoundException {
        Reader reader = new InputStreamReader(new FileInputStream("filePath"));
        // other code...
    }
}

由于filePath是docker配置中的特殊路径,我和我的导师决定使用MOCK返回一个d来测试A类。
我不知道如何模拟这种情况。以前,我确实在Mockito中使用FieldSetter来解决简单的情况。

s2j5cfk0

s2j5cfk01#

第一个选项是将D声明为构造函数参数。这也称为依赖注入,对测试很有用。此外,您仍然可以使用没有任何参数的构造函数:

public class A {
    public A (D d) throws FileNotFoundException {
        this.d = d;
    }
    public A () throws FileNotFoundException {
        this(new D());
    }

    private final D d;
} 

@Test
void test() {
    D mock = mock(D.class);
    A tested = new A(mock);
    // ...
}

或者,您可以更优雅地测试此代码,而无需任何mock。为此,我们需要将相同的技术应用于D,并使用依赖注入来传递Reader

public class D { 
    public D () throws FileNotFoundException {
        this(new InputStreamReader(new FileInputStream("filePath")));
    }
    public D (Reader reader) throws FileNotFoundException {
        // other code...
    }
}

由于Reader是一个接口,我们可以在测试中使用不同的实现。例如,我们可以使用StringReader

@Test
void test() {
    D d = new D(new StringReader("my test file content"));
    A tested = new A(d);
    // ...
}

相关问题