问题描述
我需要模拟一个测试场景,在该场景中我调用 String 对象的 getBytes()
方法并得到 UnsupportedEncodingException.
I need to simulate a test scenario in which I call the getBytes()
method of a String object and I get an UnsupportedEncodingException.
我已尝试使用以下代码来实现:
I have tried to achieve that using the following code:
String nonEncodedString = mock(String.class);
when(nonEncodedString.getBytes(anyString())).thenThrow(new UnsupportedEncodingException("Parsing error."));
问题是,当我运行我的测试用例时,我得到一个 MockitoException,它说我无法模拟 java.lang.String 类.
The problem is that when I run my test case I get a MockitoException that says that I can't mock a java.lang.String class.
有没有办法使用 mockito 来模拟 String 对象,或者,当我调用 getBytes 方法时,是否可以让我的 String 对象抛出 UnsupportedEncodingException?
Is there a way to mock a String object using mockito or, alternatively, a way to make my String object throw an UnsupportedEncodingException when I call the getBytes method?
这里有更多细节来说明问题:
Here are more details to illustrate the problem:
这是我要测试的类:
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):
This is my testing class (I'm using JUnit 4 and 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);
}
}
推荐答案
问题是Java中的String
类被标记为final,所以使用传统的mocking框架不能mock.根据 Mockito FAQ,这也是该框架的限制.
The problem is the String
class in Java is marked as final, so you cannot mock is using traditional mocking frameworks. According to the Mockito FAQ, this is a limitation of that framework as well.
这篇关于如何使用 mockito 模拟字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!