防止在模拟时在构造函数中调用函数,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
}
}
我有一个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
}
}