我有以下代码
class A {
public int someMethod(int someParameters....) {
........// some implementation
}
}
class B extends A {
public int someMethodFromB(int someParameters....) {
........// some implementation
return someMethod(someParameters....);
}
}
我正在为 someMethodFromB 编写 B 类测试,我想模拟我们返回值的 someMethod。当 B 扩展 A 时,如何测试代码。
我尝试过以下2种方法,但没有成功
@Test
public void testSomeMethodFromB() throws Exception {
ContextData contextData = mock(ContextData.class);
SomeObject obj = mock(SomeObject.class);
B b = spy(new B());
doReturn(obj).when(b).someMethod(obj, contextData, false);
Assert.assertNotNull(b.someMethodFromB(someAnotherObj, contextData, Optional.of("someString")));
}
还有这个
@Mock
private A a;
@InjectMock
private B b;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSomeMethodFromB() throws Exception {
ContextData contextData = mock(ContextData.class);
SomeObject obj = mock(SomeObject.class);
when(a.someMethod(obj, contextData, false)).thenReturn(obj);
b.someMethodFromB(someAnotherObj, contextData, Optional.of("someString"));
}
可能是我,但是这个:
@Test
public void testSomeMethodFromB() throws Exception {
ContextData contextData = mock(ContextData.class);
SomeObject obj = mock(SomeObject.class);
when(a.someMethod(obj, contextData, false)).thenReturn(obj);
b.someMethodFromB(someAnotherObj, contextData, Optional.of("someString"));
}
对我来说毫无意义,SomeObject.class 和 SomeAnotherObj 是什么? SomeAnotherObj 作为参数传递但从未定义? 您模拟 SomeObject.class 但从未提及它,这只是您测试所需的东西,与问题无关吗? 我认为你可以做这样的事情:
public class BTest {
@Mock
private A a;
@InjectMocks
private B b;
@Test
public void testSomeMethodFromB() {
when(a.someMethod(something)).thenReturn(something);
int result = b.someMethodFromB(something);
Assert.assertEquals(expected, result);
}
再次,也许我错了,这是漫长的一天工作,但我不太明白这些例子 无论如何,祝你好运!
我尝试了您想要做的事情的简化版本并且它有效:
public class A {
public int someMethod(int value) {
return 2 * value;
}
}
class B extends A {
public int someMethodFromB(int value) {
return someMethod(value);
}
}
class BTest {
@Test
void myTest() {
B spyB = spy(new B());
doReturn(5).when(spyB).someMethod(8);
assertEquals(5, spyB.someMethodFromB(8));
}
}
所以我的猜测是,您在测试中传递给
someMethod
的参数与调用它时代码接收到的参数并不完全相同。
调试您的测试并检查调用
someMethod
时的参数是什么,以确保它们是您在 doReturn...
调用时在测试中传递的参数。