如何使用模拟来模拟字符串?

2022-09-01 01:53:07

我需要模拟一个测试场景,在这个场景中,我调用了一个 String 对象的方法,然后我得到了一个不受支持的编码异常。getBytes()

我试图使用以下代码来实现这一点:

String nonEncodedString = mock(String.class);
when(nonEncodedString.getBytes(anyString())).thenThrow(new UnsupportedEncodingException("Parsing error."));

问题是,当我运行我的测试用例时,我得到一个MockitoException,说我不能模拟java.lang.String类。

有没有办法使用 mockito 模拟 String 对象,或者,有没有办法让我的 String 对象在调用 getBytes 方法时抛出一个不受支持的编码异常?


以下是说明问题的更多详细信息:

这是我要测试的类:

public final class A {
    public static String f(String str){
        try {
            return new String(str.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            // This is the catch block that I want to exercise.
            ...
        }
    }
}

这是我的测试类(我使用的是JUnit 4和mockito):

public class TestA {

    @Test(expected=UnsupportedEncodingException.class)
    public void test(){
        String aString = mock(String.class);
        when(nonEncodedString.getBytes(anyString())).thenThrow(new UnsupportedEncodingException("Parsing error."));
        A.f(aString);
    }
}

答案 1

问题是Java中的类被标记为最终类,因此您无法模拟正在使用传统的模拟框架。根据Mockito FAQ,这也是该框架的局限性。String


答案 2

如何创建一个编码名称错误的编码?看String

public String(byte bytes[], int offset, int length, String charsetName)

嘲笑几乎肯定是一个坏主意。String


推荐