java - Mockito 在调用 getter 时设置字段

标签 java junit mocking mockito

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

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

最佳答案

查看您的代码,您无法将模拟的 Entity 实例注入(inject)到您的方法中。

您必须调整您的 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
        }
    }
}

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

关于java - Mockito 在调用 getter 时设置字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951898/

相关文章:

java - 引用游标和直接 Java 代码之间的性能差异

java - 将字符串转换为数学表达式?

java - 朱尼特 : Test case for New Method which Returns Object

Java JUnit 5 注释差异

android - 如何测试 Android ActionBar 子菜单?

c# - 在 db.database.BeginTransaction() 范围下添加时,Entity FrameWork Core 不响应 where() 查询 -Exception(请求超时)

swift - 即使在 XCTest 文件中的类扩展中实现了方法之后,协议(protocol)的默认实现也始终会被调用

java - Baby 的第一个 Java 类和方法

Java代码中的Javascript

c# - Rhino Mocks 模拟 WindowsImpersonationContext