模拟异常对象(JUnit / Mockito)

时间:2018-04-22 09:29:36

标签: java junit mockito

我正面临使用JUnit / Mockito测试遗留代码的问题, 我的方法抛出一个异常(HandlerException),它派生自(BaseException),它是我们基础结构的一部分。

public static void parse(JsonElement record) throws HandlerException
{   
    JsonElement element = record.getAsJsonObject().get(ID_TAG); 
    if(element == null) {
        throw new HandlerException("Failed to find Id ...");
    }
    ...
}

我的被测系统非常简单:

@Test (expected=HandlerException.class)
public void testParseg() throws HandlerException {
    JsonElement jsonElement = new JsonParser().parse("{}");
    Parser.parse(jsonElement);
}

还有测试本身

public class Odds
{
    public List<string> h2h { get; set; }
}

public class Williamhill
{
    public Odds odds { get; set; }
    public int last_update { get; set; }
}

public class Sites
{
    public Williamhill williamhill { get; set; }
}
//here the root object is the sites but ofcourse the real root object is events
public class RootObject
{
    public Sites sites { get; set; }
}

string json = // yourJson
JObject obj = JObject.Parse(json);

var h2h = obj["events"]["Arsenal_West Ham United"]["sites"]["williamhill"]["odds"]["h2h"];
foreach (var item in h2h)
{
   Debug.WriteLine(item);
}

问题出在BaseException上。它是一个复杂的类,取决于初始化。在没有初始化的情况下,BaseException在其构造函数中抛出异常:(这反过来导致StackOverflowException。

是否有可能以任何方式模拟BaseException或HandlerException以避免这种初始化使我的测试变得简单?

1 个答案:

答案 0 :(得分:0)

看起来我的问题的答案是使用PowerMockito

首先我在我的被测系统上使用@PrepareForTest(Parser.class)

@RunWith(PowerMockRunner.class)
@PrepareForTest({Parser.class})

然后我使用PowerMockito.whenNew

模拟了HandlerExeption类
@Mock
HandlerException handlerExceptionMock;

@Before 
public void setup() throws Exception {
    PowerMockito.whenNew(HandlerException.class)
        .withAnyArguments().thenReturn(handlerExceptionMock);
}

@Test (expected=HandlerException.class)
public void testParseg() throws HandlerException {
    JsonElement jsonElement = new JsonParser().parse("{}");
    Parser.parse(jsonElement);
}

这样就没有构造BaseException,我的测试通过而无需初始化它。

注意:我知道这不是最好的做法,但是,在我的情况下,我不得不编辑BaseException。