举个栗子(代码片段):
DemoServiceImpl:
import org.sPRingframework.beans.factory.annotation.Autowired;public class DemoServiceImpl implements DemoService { @Autowired private DemoDao demoDao; @Autowired private StockDao stockDao; /** * 更新库存 * * @return */ public int updateCount(int id, int count) { //...... UPDATE Database return stockDao.queryStock(id) - count;//返回数量 }}DemoServiceImplAutowireTest:
import mockit.*;import mockit.integration.junit4.JMockit;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;/** * Autowired对象 Mock测试 */@RunWith(JMockit.class)public class DemoServiceImplAutowireTest { /** * 被测试的对象,只能是具体类,而不能是接口,因为一个接口可能有多个实现类 * 所有带有@Injectable的实例均被自动注入该实例中 */ @Tested private DemoServiceImpl noteService; /** * 自动注入到noteService中,只有一个StockDao的特定实例stockDao被MOCK掉 */ @Injectable private StockDao stockDao; @Test public void test() { // 1. record 录制期望值 new Expectations() { { stockDao.queryStock(anyInt);// mock这个方法,无论传入任何Int类型的值,都返回同样的值,达到黑盒的效果 result = 50; times = 1; } }; // 2. replay 调用 Assert.assertEquals(50 - 10, noteService.updateCount(1, 10)); //验证结果 //3.校验是否只调用了一次。 new Verifications() { { stockDao.queryStock(anyInt); times = 1; } }; }}新闻热点
疑难解答