【问题标题】:Mockito 3 mock method of an autowired class自动装配类的 Mockito 3 模拟方法
【发布时间】:2021-05-21 10:41:30
【问题描述】:

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

我想测试这个类:

@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)返回1?

【问题讨论】:

  • 不要使用字段注入。如果您使用构造函数注入,则不必费心使用所有这些注释来尝试并让自动装配在测试中工作。为了测试,你不关心类如何获得它的依赖。您只想创建MyClass 的实例。如果你使用构造函数注入,你可以直接在测试中做new MyClass(myMockAutowired)

标签: java mockito junit5


【解决方案1】:

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

你有两个选择:

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

我通常使用第二个选项,它更优雅。

【讨论】:

  • 谢谢,效果很好!一点更正:它是@InjectMocks
  • @Izaya 你是对的,让我纠正我的错别字。谢谢。
猜你喜欢
  • 2021-09-02
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多