4 回答
TA贡献1828条经验 获得超3个赞
您可以用 try/catch 包围失败的部分,并在 try 块的末尾调用 fail()。如果抛出异常,则不应到达 fail() 指令,并且您的测试应该通过。
TA贡献1744条经验 获得超4个赞
@Test有一个参数断言一个特定的异常被抛出,你可以像这样编写你的测试:
@Test(expected = IOException.class)
public void testSize() throws ClientProtocolException, IOException {
...
}
TA贡献1853条经验 获得超9个赞
您可以通过 3 种方式实现这一目标:
1)@Test(expected = ....在提供要检查的异常类的地方使用 ) 注释。
@Test(expected = IOException.class)
public void test() {
//... your test logic
}
这不是异常测试的推荐方法,除非您的测试真的很小并且只做一件事。否则,您可能会抛出异常IOException,但您无法确定是测试代码的哪一部分引起的。
2)@Rule对类使用注解ExpectedException:
@Rule
public ExpectedException exceptionRule = ExpectedException.none();
@Test
public void testExpectedException() {
exceptionRule.expect(IOException.class);
exceptionRule.expectMessage("Request too big.");
//... rest of your test logic here
}
请注意,exceptionRule必须是public。
3)最后一个,很老式的方式:
@Test
public void test() {
try {
// your test logic
fail(); // if we get to that point it means that exception was not thrown, therefore test should fail.
} catch (IOException e) {
// if we get here, test is successfull and code seems to be ok.
}
}
这是一种老式的方法,它会在本应干净的测试中添加一些不必要的代码。
TA贡献2021条经验 获得超8个赞
还有另一种解决方案,尚未在这些答案中提出,这是我个人的偏好。assertThatThrownBy 断言
在你的情况下
@Test
public void testSizeException(){
assertThatThrownBy(()-> Request.Post(mockAddress)
.connectTimeout(2000)
.socketTimeout(2000)
.bodyString(s, ContentType.TEXT_PLAIN)
.execute().returnContent().asString())
.isInstanceOf(IOException.class)
.hasMessageContaining("Request content exceeded limit of 2048
bytes");
}
添加回答
举报