Back to Repositories

Testing Data Desensitization Patterns in RuoYi Vue Pro

This test suite validates the data desensitization functionality in the RuoYi Vue Pro framework, focusing on various types of sensitive data masking including personal information, financial data, and contact details.

Test Coverage Overview

The test suite provides comprehensive coverage of data desensitization patterns.

Key areas tested include:
  • Personal information masking (Chinese names, ID cards)
  • Financial data protection (bank card numbers)
  • Contact information security (phone numbers, email addresses)
  • Vehicle information masking (car license numbers)
  • Custom pattern desensitization using regex and slider annotations

Implementation Analysis

The testing approach utilizes JUnit 5 with Mockito extension for robust unit testing. The implementation leverages custom annotations for different desensitization patterns, with JSON serialization/deserialization to verify the masking process.

Key patterns include:
  • Annotation-based desensitization rules
  • Flexible masking parameters for prefix/suffix retention
  • Custom replacement character support
  • Regex-based pattern matching

Technical Details

Testing infrastructure includes:
  • JUnit Jupiter for test execution
  • Mockito extension for mocking support
  • Custom desensitization annotations (@ChineseNameDesensitize, @BankCardDesensitize, etc.)
  • JsonUtils for object serialization
  • Lombok for reducing boilerplate code
  • Assertion utilities for validation

Best Practices Demonstrated

The test suite exemplifies several testing best practices.

Notable aspects include:
  • Comprehensive test data coverage with realistic examples
  • Clear test structure with setup, execution, and assertion phases
  • Strong validation of transformation results
  • Modular annotation-based approach for maintainability
  • Proper encapsulation of test data in static inner class

yunaiv/ruoyi-vue-pro

yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/DesensitizeTest.java

            
package cn.iocoder.yudao.framework.desensitize.core;

import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.desensitize.core.annotation.Address;
import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.EmailDesensitize;
import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.RegexDesensitize;
import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.*;
import lombok.Data;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

/**
 * {@link DesensitizeTest} 的单元测试
 */
@ExtendWith(MockitoExtension.class)
public class DesensitizeTest {

    @Test
    public void test() {
        // 准备参数
        DesensitizeDemo desensitizeDemo = new DesensitizeDemo();
        desensitizeDemo.setNickname("芋道源码");
        desensitizeDemo.setBankCard("9988002866797031");
        desensitizeDemo.setCarLicense("粤A66666");
        desensitizeDemo.setFixedPhone("01086551122");
        desensitizeDemo.setIdCard("530321199204074611");
        desensitizeDemo.setPassword("123456");
        desensitizeDemo.setPhoneNumber("13248765917");
        desensitizeDemo.setSlider1("ABCDEFG");
        desensitizeDemo.setSlider2("ABCDEFG");
        desensitizeDemo.setSlider3("ABCDEFG");
        desensitizeDemo.setEmail("[email protected]");
        desensitizeDemo.setRegex("你好,我是芋道源码");
        desensitizeDemo.setAddress("北京市海淀区上地十街10号");
        desensitizeDemo.setOrigin("芋道源码");

        // 调用
        DesensitizeDemo d = JsonUtils.parseObject(JsonUtils.toJsonString(desensitizeDemo), DesensitizeDemo.class);
        // 断言
        assertNotNull(d);
        assertEquals("芋***", d.getNickname());
        assertEquals("998800********31", d.getBankCard());
        assertEquals("粤A6***6", d.getCarLicense());
        assertEquals("0108*****22", d.getFixedPhone());
        assertEquals("530321**********11", d.getIdCard());
        assertEquals("******", d.getPassword());
        assertEquals("132****5917", d.getPhoneNumber());
        assertEquals("#######", d.getSlider1());
        assertEquals("ABC*EFG", d.getSlider2());
        assertEquals("*******", d.getSlider3());
        assertEquals("1****@email.com", d.getEmail());
        assertEquals("你好,我是*", d.getRegex());
        assertEquals("北京市海淀区上地十街10号*", d.getAddress());
        assertEquals("芋道源码", d.getOrigin());
    }

    @Data
    public static class DesensitizeDemo {

        @ChineseNameDesensitize
        private String nickname;
        @BankCardDesensitize
        private String bankCard;
        @CarLicenseDesensitize
        private String carLicense;
        @FixedPhoneDesensitize
        private String fixedPhone;
        @IdCardDesensitize
        private String idCard;
        @PasswordDesensitize
        private String password;
        @MobileDesensitize
        private String phoneNumber;
        @SliderDesensitize(prefixKeep = 6, suffixKeep = 1, replacer = "#")
        private String slider1;
        @SliderDesensitize(prefixKeep = 3, suffixKeep = 3)
        private String slider2;
        @SliderDesensitize(prefixKeep = 10)
        private String slider3;
        @EmailDesensitize
        private String email;
        @RegexDesensitize(regex = "芋道源码", replacer = "*")
        private String regex;
        @Address
        private String address;
        private String origin;

    }

}