我正面临使用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以避免这种初始化使我的测试变得简单?
答案 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。