在Spring中实例化模拟对象时,如何设置Mockito`of`方法?

时间:2015-03-24 22:42:20

标签: spring unit-testing mockito

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的吸气剂,而且我只是添加一个吸气剂,所以我可以测试ObjectToBeTested

1 个答案:

答案 0 :(得分:4)

这就是我如何在春天使用Mockito的方式。

让我们假设我有一个使用服务的Controller,这个服务注入了自己的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,但是如果你确实只使用它来进行单元测试。