Spring的Bean如何进行Mock

上一篇文章讲了Spring的Bean的单元测试如何写,但是如果我们的一个Bean依赖了很多其他的Bean,而其他的Bean也有依赖,而我们只是想测试这个Bean的功能应该怎么办呢?
这里也引发了一个另一个联调和自测的问题,比如我们有2个调用的Bean,且命名A和B,A依赖B,两个Bean的实现都需要10天,比如我们写了一个Bean A,但是依赖其他研发写的Bean B,B的接口定义提供了,但是实现需要在10天之后提供,而A也需要10天,总的开发时间就是20天了,2个Bean需要翻倍的开发时间,那5个Bean呢,50个Bean呢?消耗的时间讲师倍数增加,同样联调也是需要消耗等待时间的。那么又该如何解决这种相互依赖的自测和联调问题?

Spring也提供了相关的能力,那就是注解@MockBean和@SpyBean,Mock和Spy的区别见博客
我这里就不特别说明了,Mock和Spy的使用详见官方文档
还是拿上一篇的判断是否是工作来举例,上一篇是没有进行任何Mock,直接调用的下游的服务,依赖关系如下。

@Service
public class CalendarIntegrationImpl implements CalendarIntegration {
    @Autowired
    private CalendarContract calendarContract;
}

单元测试代码如下:

public class CalendarIntegrationDemoTest extends BaseTest {
    @Autowired
    private CalendarIntegration calendarIntegration;
    @MockBean
    @Autowired
    private CalendarContract calendarContract;

    @Test
    public void testMockHolidayNotWork(){
        Mockito.when(calendarContract.checkHoliday(Mockito.any())).thenReturn(Boolean.TRUE);
        boolean work = calendarIntegration.whetherWork(new Date());
        Assert.assertFalse(work);
    }

    @Test
    public void testMockHolidayWork(){
        Mockito.when(calendarContract.checkHoliday(Mockito.any())).thenReturn(Boolean.FALSE);
        boolean work = calendarIntegration.whetherWork(new Date());
        Assert.assertTrue(work);
    }
}

是不是很好用。

你可能感兴趣的:(Java单元测试,Java)