【发布时间】:2021-07-05 08:27:25
【问题描述】:
我正在尝试存根测试类的方法。而且它不起作用。
就像在课堂下面测试一样
enter code here
Class to test:
public Class A{
public String method1(){
C c=new C();
int num=c.methodC();
B b=new B();
String str=method2(b);
return str;
}
public String method2(B b){
String str=method2(b);
return str;
}
}
JUnit class:
@RunWith(JUnitPlatform.class)
Class ATest {
@InjectMocks
A a;
@Mock
C c;
@Mock
A a1;
@BeforeEach
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testMethod1(){
Mockito.doReturn(34).when(c).methodC(anyString());
a1=Mockito.mock(A.class);
Mockito.doReturn("Added successfully").when(a1).method2(any(B.class));
assertEquals("Added successfully", a.method1());
}
}
当我从 C 类中存根 methodC(...) 时,它正在工作。但是 A 类中的 method2(...) 不是存根。
请告诉我问题是什么,以及解决方案。
【问题讨论】:
-
您没有将模拟传递给被测对象。您在被测方法中创建新的 B 和新的 C。除此之外还有一些拼写错误:A1 可能是 B 的一个实例。调用 initMocks 时不需要 Mockito.mock
-
在任何一种情况下都编辑了我的帖子:无论是否使用 Mockito.mock,不管调用的是什么实际方法,而不是存根一个。当我调用同一测试类的方法时会发生这种情况。
-
你仍然: 1. 在被测方法中创建新的 c 并在其上调用一个方法。因此,
c. methodC的存根不起作用。 2.你存根a1. method2,但调用a.method2。 a1 和 a 是 2 个不同的对象,这个存根也不起作用。如果你只想存根一个对象的某些部分,你需要一个@Spy,而不是一个模拟。 -
我最初使用了 a.method2(..),它没有工作,所以尝试使用新对象,认为可能是 @InjectMock 不允许存根方法。在这两种情况下,它都不是调用存根方法而是调用实际方法。我得到:
-
如果我使用相同的对象进行存根和调用测试方法,我会得到如下异常:传递给 when() 的参数不是模拟!
标签: mockito junit5 stubbing clause