junit mockito Dao层

Dao层单元测试需要启动服务的上下文

业务逻辑需要别名进行MOCK打桩

为了不影响测试结果和对数据库产生脏数据,使用@Sql注解来完成相关数据的初始化和清除

Dao

public interface BranchDao extends BaseDao<BranchPO, Long> {
    @Modifying
    @Transactional
    @Query(nativeQuery = true,
            value = "update T_BRANCH_INFO set ADDRESS=?2, UPDATE_DATE=sysdate where BRANCH_NO=?1")
    int updateAddressByBranchNo(Long branchNo, String address);

}

Service Impl

@Slf4j
@Service
public class BranchServiceImpl implements BranchService {
    @Autowired
    private BranchRepository branchRepository;

    @Override
    public boolean updateAddressByBranchNo(Long branchNo, String address) {
        if (branchNo == null || address == null) {
            return false;
        }
        try {
            return branchRepository.updateAddressByBranchNo(branchNo, address) > 0;
        } catch (Exception e) {
            log.error("修改营业部的地址异常, branchNo={}, address={}", branchNo, address, e);
        }
        return false;
    }
}

BaseTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class BaseTest extends Mockito {
}

Test

@Slf4j
public class BranchServiceImplTest extends BaseTest {

    @Autowired
    //Autowired为了上下文测试
    private BranchServiceImpl branchService;

    @InjectMocks
    //InjectMocks启个别名Mock打桩单元测试
    private BranchServiceImpl mockBranchService;

    @Mock
    private BranchRepository branchRepository;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void updateAddressByBranchNo_NullBranchNo_ReturnsFalse() {
        boolean result = branchService.updateAddressByBranchNo(null, "123 Main St");
        Assert.assertFalse(result);
    }

    @Test
    public  void updateAddressByBranchNo_NullAddress_ReturnsFalse() {
        boolean result = branchService.updateAddressByBranchNo(1L, null);
        Assert.assertFalse(result);
    }

    @Test
    @SqlGroup({
            @Sql(statements = {"insert into t_branch_info(id,branch_no,branch_name,address) values(seq_branch_info.nextval,100,'营业部名称','营业部地址')"},executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD),
            @Sql(statements = {"delete t_branch_info where branch_no=100"},executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
    })
    public void updateAddressByBranchNo_Success_ReturnsTrue() {
        BranchInfoVO vo = branchService.findByBranchNo(100L);
        Assert.assertEquals("营业部名称",vo.getBranchName());
        Assert.assertEquals("营业部地址",vo.getAddress());
        boolean result = branchService.updateAddressByBranchNo(100L, "123 Main St");
        Assert.assertTrue(result);
        vo = branchService.findByBranchNo(100L);
        Assert.assertEquals("123 Main St",vo.getAddress());
    }

    @Test
    public  void updateAddressByBranchNo_Update_ReturnsFalse() {
        boolean result = branchService.updateAddressByBranchNo(100L, "123 Main St");
        Assert.assertFalse(result);
    }

    @Test
    public  void updateAddressByBranchNo_Exception_ReturnsFalse() {
        when(branchRepository.updateAddressByBranchNo(anyLong(),anyString())).thenThrow(new RuntimeException());
        boolean result = mockBranchService.updateAddressByBranchNo(100L, "123 Main St");
        Assert.assertFalse(result);
    }
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值