我正在测试方法并且遇到一个问题,即我的实体有一个null的字段,但我需要它不是空的。我有这个:
class MyClass {
void myMethod() {
Entity entity = new Entity();
String str = entity.getField(); // It's null now
if (str == null) { //always true
//do something
}
}
}
现在在测试中我需要我的字段不为空。
我试着在测试中做以下事情:
Entity entity = mock(Entity.class);
when(entity.getField()).thenReturn("text");
但似乎它不起作用。问题是我无法使用PowerMock或重构原始类
有没有办法可以在if
语句之前返回文本或设置字段?
答案 0 :(得分:3)
查看代码,您无法将模拟的Entity
实例注入到您的方法中。
您必须调整MyClass
以使其接受Entity
对象,从而允许您传递模拟对象以进行测试。如果没有这个,你就不能期望能够模拟对象。
class MyClass {
private Entity entity;
public MyClass(Entity entity) {
this.entity = entity;
}
void myMethod() {
String str = entity.getField(); // It's null now
if (str == null) { //always true
//do something
}
}
}
如果您不想更改面向公众的构造函数,请考虑添加一个package-private setter方法,以便您调整Entity
实例。但是您必须将实例存储为一个字段,以允许您从测试代码中更改它。
答案 1 :(得分:0)
可能,“spy()”可以用来代替“when()”:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13
答案 2 :(得分:0)
之前我遇到过类似的问题,我所做的就是创建一个单独的包装器方法来为单元测试注入依赖项。
例如,在这里,您可以创建wrapperMyMethod()来解决问题,代码将是:
void wrapperMyMethod(){
Entity entity = new Entity();
void myMethod(entity);
}
void myMethod(Entity entity) {
String str = entity.getField();
}
希望这能解决您的问题。