自动装配的 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
.
你有两个选择:
- 在
MyClass
中创建一个 setMyAutowired
方法并在您的测试 class. 中将 MyAutowired
实例传递给它
- 正在
MyClass
上用 @InjectMocks
注释替换 @Autowired
。这样,将创建一个 MyClass
的实例,并在其中自动注入您在测试中声明的模拟对象。
我一般用第二种,比较优雅
我正在使用 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
.
你有两个选择:
- 在
MyClass
中创建一个setMyAutowired
方法并在您的测试 class. 中将 - 正在
MyClass
上用@InjectMocks
注释替换@Autowired
。这样,将创建一个MyClass
的实例,并在其中自动注入您在测试中声明的模拟对象。
MyAutowired
实例传递给它
我一般用第二种,比较优雅