是否有可能调用嘲笑对象的方法?(Is it possible to invoke mocked ob

2019-09-30 07:47发布

我有,例如,这个类:

public class A {
    private List<String> list;

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

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

我想单元测试someMethod而不调用构造函数。 我使用反射来设置list

问题是,我不希望创建B类的对象,我不能嘲笑它,因为它会导致NPE。

所以我的问题是:

如何测试someMethod不调用的构造A ? 有没有什么办法来模拟A类和不输posibility调用方法?

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

注:不想改变类的任何部分。 我问,如果它能够在不追加,变更类的任何执行此测试。

Answer 1:

您可以测试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));
    }
}


Answer 2:

你应该模拟出的合作者类 - 这意味着你可以创建的类被测试的实例,并通过在嘲笑,配置为“做正确的事”时,它的方法被调用。

在你的榜样,你要创建一个模拟B,并使用它像这样:

@RunWith(MockitoJUnitRunner.class)
class myTest {
  @Mock private B b;

  public void someMethod() {
    doReturn(new ArrayList<String>()).when(b).getList();
    A a = new A(b);
    assertEquals("result", a.someMethod().get(0));
  }
}


Answer 3:

我不希望创建B级对象

加入这不需要B.构造函数或工厂方法

public A(B b){
    this(b.getList());
}

/* package local */ A(List<String> list){
    this.list = list;
}

通过使构造包当地可以通过单元测试在同一个包进行访问。

如何在不调用构造函数的测试的someMethod?

您可以使用

A a = theUnsafe.allocateInstance(A.class);

但不建议这样做,除非你有没有其他选择,例如反序列化。



文章来源: Is it possible to invoke mocked object's method?