在 Spring 中实例化模拟对象时如何设置 Mockito `when` 方法?
How can I set Mockito `when` method when instantiating mock objects in Spring?
The method described in this answer 最适合我实例化模拟对象。
<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.package.Dao" />
</bean>
但是,我还需要设置 Mockito when
方法。
我可以在 XML 中这样做吗,或者是唯一的方法,例如:
when( objectToBestTested.getMockedObject()
.someMethod(anyInt())
).thenReturn("helloWorld");
在我的测试用例中?
我问的原因是因为我不需要 MockedObject
的 getter,我只会添加 getter 这样我就可以测试 ObjectToBeTested
。
这就是我将 Mockito 与 Spring 一起使用的方式。
假设我有一个使用服务的控制器,这个服务注入了它自己的 DAO,基本上有这个代码结构。
@Controller
public class MyController{
@Autowired
MyService service;
}
@Service
public class MyService{
@Autowired
MyRepo myRepo;
public MyReturnObject myMethod(Arg1 arg){
myRepo.getData(arg);
}
}
@Repository
public class MyRepo{}
以下代码用于 junit 测试用例
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest{
@InjectMocks
private MyService myService;
@Mock
private MyRepo myRepo;
@Test
public void testMyMethod(){
Mockito.when(myRepo.getData(Mockito.anyObject()).thenReturn(new MyReturnObject());
myService.myMethod(new Arg1());
}
}
如果您使用的是独立应用程序,请考虑如下模拟。
@RunWith(MockitoJUnitRunner.class)
public class PriceChangeRequestThreadFactoryTest {
@Mock
private ApplicationContext context;
@SuppressWarnings("unchecked")
@Test
public void testGetPriceChangeRequestThread() {
final MyClass myClass = Mockito.mock(MyClass.class);
Mockito.when(myClass.myMethod()).thenReturn(new ReturnValue());
Mockito.when(context.getBean(Matchers.anyString(), Matchers.any(Class.class))).thenReturn(myClass);
}
}
我真的不喜欢在应用程序上下文中创建模拟 bean,但如果您确实希望它仅可用于您的单元测试。
The method described in this answer 最适合我实例化模拟对象。
<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.package.Dao" />
</bean>
但是,我还需要设置 Mockito when
方法。
我可以在 XML 中这样做吗,或者是唯一的方法,例如:
when( objectToBestTested.getMockedObject()
.someMethod(anyInt())
).thenReturn("helloWorld");
在我的测试用例中?
我问的原因是因为我不需要 MockedObject
的 getter,我只会添加 getter 这样我就可以测试 ObjectToBeTested
。
这就是我将 Mockito 与 Spring 一起使用的方式。
假设我有一个使用服务的控制器,这个服务注入了它自己的 DAO,基本上有这个代码结构。
@Controller
public class MyController{
@Autowired
MyService service;
}
@Service
public class MyService{
@Autowired
MyRepo myRepo;
public MyReturnObject myMethod(Arg1 arg){
myRepo.getData(arg);
}
}
@Repository
public class MyRepo{}
以下代码用于 junit 测试用例
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest{
@InjectMocks
private MyService myService;
@Mock
private MyRepo myRepo;
@Test
public void testMyMethod(){
Mockito.when(myRepo.getData(Mockito.anyObject()).thenReturn(new MyReturnObject());
myService.myMethod(new Arg1());
}
}
如果您使用的是独立应用程序,请考虑如下模拟。
@RunWith(MockitoJUnitRunner.class)
public class PriceChangeRequestThreadFactoryTest {
@Mock
private ApplicationContext context;
@SuppressWarnings("unchecked")
@Test
public void testGetPriceChangeRequestThread() {
final MyClass myClass = Mockito.mock(MyClass.class);
Mockito.when(myClass.myMethod()).thenReturn(new ReturnValue());
Mockito.when(context.getBean(Matchers.anyString(), Matchers.any(Class.class))).thenReturn(myClass);
}
}
我真的不喜欢在应用程序上下文中创建模拟 bean,但如果您确实希望它仅可用于您的单元测试。