在方法中模拟静态方法并修改返回值

问题描述

我正在构建一个spring boot实用程序,并为此实用程序编写测试用例。我有内部调用另一个静态方法的方法。想模拟静态方法调用的返回值。尝试使用PowerMock,但无法实现此目的。您能否让我知道需要做什么。下面是代码段。

@Slf4j
public class DOBMaskingStrategy extends AbstractMaskingStrategy {

    public DOBMaskingStrategy() {
        super();
    }

    @Override
    public String name() {
        return "DOB";
    }

    @Override
    public String unmask(String input,String key) {
        validate(input,key);
        log.info("Should Wrap Enc Value {}",UserDataHolder.shouldWrapEncValue());
        if(UserDataHolder.shouldWrapEncValue()) {
            int indexofenc = input.indexOf(UserDataHolder.encwrapper());
            if(indexofenc != -1) {
                return input.substring(0,indexofenc)+unmaskdata(input.substring(indexofenc),key); 
            }else {
                return unmaskdata(input,key);  
            }

        }else {
            int inputlength = input.length();
            Assert.isTrue(inputlength == 10,"Please provide a proper date in the format mm/dd/yyyy");
            return input.substring(0,inputlength-4)+unmaskdata(input.substring(inputlength-4),key);
        }
    }

}


@Slf4j
public class UserDataHolder {
    private static Environment env = AppContext.getBean(Environment.class);
    private static final boolean WRAPENCVALUE = null != env.getProperty("app.pii.settings.wrapencvale")? Boolean.parseBoolean(env.getProperty("app.pii.settings.wrapencvale")):false;
    
    public static boolean shouldWrapEncValue() {
            return WRAPENCVALUE;
    }
}

测试用例

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@AutoConfigureMockMvc
@PrepareForTest({UserDataHolder.class,DOBMaskingStrategy.class})
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT,classes=PiiApplication.class)
@ComponentScan({"com.test"})
@TestPropertySource("classpath:application_2.properties")
class PiiApplicationWithEncTest {
    
    @Test
    void contextLoads() {
    }
    
    @Before
    public void setUp() {
        PowerMockito.mockStatic(UserDataHolder.class);
        //when(UserDataHolder.shouldWrapEncValue()).thenReturn(true); //Tried this one as well. Didn't work.
        PowerMockito.stub(PowerMockito.method(UserDataHolder.class,"shouldWrapEncValue")).toReturn(true);
    }
    
    
    @Test
    public void maskAndUnmaskWitnWrapper() throws Exception {
        String key = new Random().ints(97,122 + 1)
                .limit(30)
                .collect(StringBuilder::new,StringBuilder::appendCodePoint,StringBuilder::append)
                .toString();
        
        UserDataHolder.updateUserEncriptionKey(key);
        
        String inputdate = "12/03/1981";
        
        AbstractMaskingStrategy dobMasking = MaskingUtilManager.getStrategy("DOB");
        PowerMockito.spy(dobMasking);
        
        
        String maskdatedata = dobMasking.mask(inputdate,key);
        String unmaskdatedata = dobMasking.unmask(maskdatedata,key);
        assertThat(inputdate.equals(unmaskdatedata));
        
        String unmaskdatedataTwo = dobMasking.unmask(maskdatedata.substring(maskdatedata.indexOf(UserDataHolder.encwrapper())+UserDataHolder.encwrapper().length(),maskdatedata.length()-1),key);
        assertThat("1981".equals(unmaskdatedataTwo));
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...