0

我正在测试方法并且有一个问题,即我的实体有一个为空的字段,但我需要它不能为空。我有这个:

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语句之前返回文本或设置字段?

4

3 回答 3

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
        }
    }
}

如果您不想更改面向公众的构造函数,请考虑添加允许您调整Entity实例的包私有 setter 方法。但是您必须将实例存储为一个字段,以允许您从测试代码中更改它。

于 2013-11-13T11:08:40.947 回答
0

可能,可以使用“spy()”代替“when()”:http ://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13

于 2013-11-13T11:03:27.927 回答
0

我之前有类似的问题,我所做的是创建一个单独的包装器方法来注入依赖项以进行单元测试。

例如,在这里,您可以创建 wrapperMyMethod() 来解决问题,代码将是:

void wrapperMyMethod(){
    Entity entity = new Entity();
    void myMethod(entity);
}
void myMethod(Entity entity) {
    String str = entity.getField(); 
}

希望这可以解决您的问题。

于 2013-11-15T18:51:10.737 回答