无法为单元测试创​​建Attribute实例

时间:2019-08-21 17:51:04

标签: java unit-testing reflection constructor mocking

我正在使用一种API,该API的方法可以从远程服务器获取一些数据。该方法的用法是这样的:

AttributeError: 'FigureCanvasAgg' object has no attribute 'invalidate'

Attribute a = obj.getRemoteAttribute(); 类是这样的

Attribute

我正在尝试模拟这种方法来创建单元测试。我支持package a.package.outside.my.project; import java.util.Date; public class Attribute { private String id; private String name; private Date modifiedAt; private String metadata; Attribute(String id, String name, Date modifiedAt, String metadata) { this.id = id; this.name = name; this.modifiedAt = modifiedAt; this.metadata = metadata; } public String getId() { return id; } public Date getModifiedAt() { return modifiedAt; } public String getMetadata() { return metadata; } public String getName() { return name; } } 。测试是这样的:

Mockito

但是,测试无法编译- @Test public void getAttributeShouldWork() throws Exception { Storage mockStorage = Mockito.mock(Storage.class); Attribute attribute = new Attribute("fake", "fakeName", new SimpleDateFormat("dd/MM/yyyy").parse("21/08/2019"), "fake Metadata"); Mockito.when(storage.getAttribute()).thenReturn(attribute); // some other stuff } (4º行)中的构造函数是程序包私有的,因此我无法在测试中使用它。我也不能扩展类-没有默认的构造函数。没有工厂可以创建Attribute,也没有可访问的构建器类。我也无法更改Attribute的代码。

所以,我的问题是-如何在模拟中创建一个可在此测试中使用的假对象?我不希望我的单元测试取决于网络或远程服务器的可用性...

1 个答案:

答案 0 :(得分:2)

在紧要关头,您可以使用反射:

private static Attribute createAttributeStub() {
    try {
        Constructor<Attribute> constructor = 
                Attribute.class.getDeclaredConstructor(String.class, String.class, 
                        Date.class, String.class);
        constructor.setAccessible(true);
        return constructor.newInstance("fake", "fakeName", 
                new SimpleDateFormat("dd/MM/yyyy").parse("21/08/2019"), "fake Metadata");
    }
    catch( ReflectiveOperationException | ParseException e ) {
        throw new RuntimeException(e);
    }
}