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
    评论
很抱歉,我不能直接帮您进行单元测试。不过,我可以提供一些关于如何使用 JUnit 进行 Web 应用程序单元测试的信息。 Web 应用程序单元测试通常涉及对控制器、服务和 DAO 进行测试,以确保它们能够正确地处理和返回数据。下面是一些使用 JUnit 进行 Web 应用程序单元测试的步骤: 1. 在您的 Maven 项目中,确保已经添加了 JUnit 依赖项。您可以在 pom.xml 文件中添加以下代码来添加 JUnit 依赖项: ```xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> ``` 2. 编写您的测试类。在测试类中,您可以使用 JUnit 提供的注解来标记测试方法。以下是一个示例测试类: ```java import org.junit.Test; public class MyControllerTest { @Test public void testGetUsers() { // 编写测试代码 } @Test public void testAddUser() { // 编写测试代码 } @Test public void testUpdateUser() { // 编写测试代码 } @Test public void testDeleteUser() { // 编写测试代码 } } ``` 3. 在测试方法中,您可以使用 Mockito 模拟对象来模拟服务和 DAO 。以下是一个示例测试方法: ```java import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.mockito.Mockito.when; public class MyControllerTest { @Mock private UserService userService; @InjectMocks private MyController myController; @Test public void testGetUsers() { MockitoAnnotations.initMocks(this); List<User> userList = new ArrayList<>(); User user1 = new User("1", "John"); User user2 = new User("2", "Jane"); userList.add(user1); userList.add(user2); when(userService.getUsers()).thenReturn(userList); List<User> result = myController.getUsers(); assertEquals(userList.size(), result.size()); } } ``` 在上面的示例中,我们使用 `@Mock` 注解来模拟 UserService,然后使用 `@InjectMocks` 注解来注入 MyController。然后,我们使用 `when` 方法来指定当调用 `userService.getUsers()` 时返回一个模拟数据列表。最后,我们调用 `myController.getUsers()` 方法并使用 `assertEquals` 方法来验证结果。 希望这些信息可以帮助您使用 JUnit 进行 Web 应用程序单元测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值