是否可以调用mocked对象的方法?

ner*_*sol 1 java reflection unit-testing mockito

例如,我有这个课程:

public class A {
    private List<String> list;

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

    public List<String> someMethod(){
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

所以我的问题是:

如何测试someMethod而不调用构造函数A?有没有办法模拟A类并且不会失去调用方法的可能性?

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

注:希望改变一个类的任何部分.我问是否有可能在没有添加或更改A类中的任何内容的情况下执行此测试.

Tat*_*era 5

您可以在不调用Mockito构造函数的情况下测试A类.不确定我是否真的了解您的要求,但以下代码对我有用.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)