java - 是否可以调用模拟对象的方法?

标签 java unit-testing reflection mockito

例如,我有这个类:

public class A {
    private List<String> list;

    public A(B b){
        list = b.getList();
    }

    public List<String> someMethod(){
        return list;
    }
}

我想在不调用构造函数的情况下对 someMethod 进行单元测试。我使用反射 来设置list

问题是我不想创建 B 类对象,我不能模拟它,因为它会导致 NPE。

所以我的问题是:

如何在不调用 A 的构造函数的情况下测试 someMethod?有什么方法可以模拟 A 类并且不会失去调用方法的可能性吗?

创建参数为零的构造函数不是解决方案。

注意:不想更改 A 类的任何部分。我问是否可以在不添加或更改 A 类中的任何内容的情况下执行此测试。

最佳答案

您可以测试类 A 而无需通过 Mockito 调用它的构造函数。不确定我是否真的理解您的要求,但以下代码对我有用。

import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;

import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ATest {

    @Test
    public void test() {
        A a = mock(A.class);
        when(a.someMethod()).thenCallRealMethod();
        List<String> listInA = new ArrayList<String>();
        ReflectionTestUtils.setField(a, "list", listInA);
        assertThat(a.someMethod(), is(listInA));
    }
}

关于java - 是否可以调用模拟对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24618956/

相关文章:

ruby-on-rails - "undefined method ` 固定装置 ' for ActiveSupport::TestCase:Class",同时使用 Rails 3.1 进行测试

c# - Service Fabric 单元测试和依赖项注入(inject)

java - Javadoc 元数据的运行时保留?

c# - 不再有动态、笨拙的反射?

java - 在 Java Swing 中停止定时器

java - Jersey 2.x 通过简单的 POST 调用(多线程)泄漏内存(终结器)

java - "someString"相当于新字符串 ("someString"吗?在java中

java - 使用 Android.mk 的aidl 文件找不到类的导入

java - 使用 Spring 测试 lambda express 出现异常

c# - 使用 LINQ 在对象图中的所有属性中查找关键字