防止在模拟时在构造函数中调用函数,Mockito?

Prevent function from being called in constructor while mocking, Mockito?

我有一个class,在构造时,无法调用某个方法。

public class ClassA() {
    @NonNull
    private ClassB b;

    public ClassA() {
        this.b = (new ClassC()).mymethod();
    }
}

我需要在不调用 ClassC().mymethod() 的情况下测试 ClassA,因为调用它会引发错误。这样做的最佳方法是什么?我用 @Mock ClassC 尝试了 ClassA 的 @InjectMocks,但它给了我空异常。

您必须重构 class 以使其更易于测试。以下代码片段中的另外两个构造函数可用于 ClassC 或 ClassB 的模拟测试:

public class ClassA() {

    @NonNull
    private ClassB b;

    public ClassA {
       this(new ClassC());
    }

    public ClassA(ClassC c) {
        this(c.mymethod());
    }

    public ClassA(ClassB b) {
        this.b = b;
    }
}

示例测试用例:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Test;

public class ClassATest {

  @Test
  public void test() {

    ClassB b = mock(ClassB.class);
    // ... setup your mock for b

    ClassC c = mock(ClassC.class);
    when(c.mymethod()).thenReturn(b);

    ClassA a = new ClassA(c);
    // ... call the method of "a" you want to test
  }
}

您可以使用 CALLS_REAL_METHODS 来避免调用 ClassA

的构造函数
@RunWith(MockitoJUnitRunner.class)
public class ClassATest {

    @Mock
    private ClassB b;

    private ClassA classA;

    @Before
    public void setUp() {
        classA = mock(ClassA.class, org.mockito.Mockito.CALLS_REAL_METHODS);
        whitebox.setInternalState(classA, "b", b);
    }

   @Test
   public void shouldDoSomething() {
       // your test
   }
}