无法用mockito测试继承方法

问题描述 投票:0回答:2

我有以下代码

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"));

    }
java spring mocking mockito jmockit
2个回答
0
投票

可能是我,但是这个:

@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);
    }

再次,也许我错了,这是漫长的一天工作,但我不太明白这些例子 无论如何,祝你好运!


0
投票

我尝试了您想要做的事情的简化版本并且它有效:

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...
调用时在测试中传递的参数。

© www.soinside.com 2019 - 2024. All rights reserved.