有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mockito:在使用@InjectMocks时模拟被测方法调用的同一类的方法

我有一个我想测试的类,它有几个外部依赖项和几个内部方法。我想为MethodA编写一个测试,但是没有方法a对MethodB的内部调用来实际练习MethodB。我想要mock/stubMethodB并返回一些特定的内容。通常我会使用when/thenReturn,但它的行为与我预期的不同——它实际上是在创建mock本身时跳入方法B

我的服务。java

@Service
public class MyService {

  @Autowired
  private ServiceA serviceA;

  @Autowired
  private ServiceB serviceB;

    public SomeObject methodA() {
      // some logic using serviceA.method and serviceB.method that creates "output"
      SomeObject someObject = methodB(output);
      return someObject;
    }

    public SomeObject methodB(SomeObject someObject) {
      // deep mysteries done here to someObject
      return someObject 
    }
}

我的服务测试。java

public class MyServiceTest {

  @Mock
  private ServiceA serviceA;

  @Mock
  private ServiceB serviceB;

  @InjectMocks
  private MyService myService;

  @Before
  public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void methodATest() {
    when(serviceA.method()).thenReturn(stuff);
    when(serviceB.method()).thenReturn(otherStuff);

    // here is what I would like to do
    when(myService.methodB()).thenReturn(mockedSomeObject); //<- doesn't work

    assertThat(myService.methodA().getSomeObjectProperty())
        .isEqualTo("property");
  }
}

我已经研究过用Mockito.mock(MyService.class)手动模拟MyService类的解决方案,但是(正如上面的例子明显是人为的)我的实际类有很多外部依赖项,我更喜欢一个解决方案,它仍然允许我对@Autowired依赖项使用@Mock模拟服务,对测试中的类使用@InitMocks,除非这根本不可能

我试过:

Mockito.doReturn(mockedSomeObject).when(myService.methodB(any(SomeObject.class));

但在为该方法创建模拟时,这也会进入MethodB,这不应该发生

提前感谢您的帮助


共 (0) 个答案