我正在使用一种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
的代码。
所以,我的问题是-如何在模拟中创建一个可在此测试中使用的假对象?我不希望我的单元测试取决于网络或远程服务器的可用性...
答案 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);
}
}