自动装配的 Mockito 3 模拟方法 class

Mockito 3 mock method of an autowired class

我正在使用 spring-boot-starter-test 2.2.0,其中包括 Mockito 3.1.0

我想测试这个class:

@RestController
public class MyClass {
    @Autowired MyAutowired myAutowired;

    public int myClassMethod(int i) {
        return myAutowired.methodToMock(i);
    }
}

哪个用这个:

@Service
public class MyAutowired {

    public int methodToMock(int i) {
        return i;
    }
}

在我的测试中,我想 运行 myClassMethod 但是 methodToMock 有一个模拟行为。理想情况下,我想检查是否使用预期参数调用了 methodToMock

这是我到目前为止尝试过的:

@SpringJUnitConfig(Config.class)
@WebAppConfiguration
@ExtendWith(MockitoExtension.class)
class MyClassTest {
    @Autowired MyClass myClass;

    @Mock
    private MyAutowired myAutowired;

    @BeforeEach
    public void initMocks(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void myTest() {
        Mockito.when(myAutowired.methodToMock(any()).thenReturn(1);

        int shouldBe1ButIs2 = myClass.myClassMethod(2);
    }

}

这有什么问题吗?以及如何使 myClass.myClassMethod(2) return 1 ?

问题是您的对象 MyClass 没有引用正确的模拟实例。 MyAutowired 必须注入 MyClass.

你有两个选择:

  1. MyClass 中创建一个 setMyAutowired 方法并在您的测试 class.
  2. 中将 MyAutowired 实例传递给它
  3. 正在 MyClass 上用 @InjectMocks 注释替换 @Autowired。这样,将创建一个 MyClass 的实例,并在其中自动注入您在测试中声明的模拟对象。

我一般用第二种,比较优雅