JUnit的4.12如何測試引發異常的任何方法調用?
我有以下實用方法:
public class StaticFieldsUtils {
public static <T> T getPublicStaticFieldByName(String name, Class<T> clazz){
for(Field f : clazz.getDeclaredFields()){
if(Modifier.isStatic(f.getModifiers()) &&
Modifier.isPublic(f.getModifiers()) &&
f.getName().equals(name))
try {
Object fieldValue = f.get(null);
if(clazz.isAssignableFrom(fieldValue.getClass()))
return (T) fieldValue;
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(String.format("Invalid access to the field %s", name));
}
}
throw new IllegalArgumentException(String.format("A public field with the name %s does not exist in the class %s", name, clazz.getSimpleName()));
}
//Some other utility methods
}
現在,我需要編寫測試案例,檢查了IllegalArgumetnException
拋出只有當有相同類型的任何公共靜態字段或它的一個亞型。
這是我傾向於寫:
public class StaticFieldsUtilsTest {
private static class StaticFieldContainer{
public static final StaticFieldContainer FIELD1 = new StaticFieldContainer();
public static final StaticFieldContainer FIELD2 = new StaticFieldContainer();
public static final StaticFieldContainer FIELD3 = new StaticFieldContainer();
public static final StaticFieldContainer FIELD4 = new StaticFieldContainer();
protected static final StaticFieldContainer FIELD5 = new StaticFieldContainer();
static final StaticFieldContainer FIELD6 = new StaticFieldContainer();
private static final StaticFieldContainer FIELD7 = new StaticFieldContainer();
public static StaticFieldContainer FIELD8 = new StaticFieldContainer();
}
@Test(expected=IllegalArgumentException.class)
public void testViolations(){
StaticFieldContainer field = StaticFieldsUtils.getPublicStaticFieldByName("FIELD5", StaticFieldContainer.class);
}
@Test(expected=IllegalArgumentException.class)
public void testViolations2(){
StaticFieldContainer field = StaticFieldsUtils.getPublicStaticFieldByName("FIELD6", StaticFieldContainer.class);
}
//ETC
}
的問題是我不能可靠地把一個以上的方法調用的一個方法@Test(expected=IllegalArgumentException.class) public void testViolationsX()
,因爲我需要檢查每個調用拋出。
問題:有一些JUnit
factility避免編寫一個方法任何這樣的調用來檢查它是否拋出?
你要測試什麼?你的utils類還是StaticFieldContainer?如果它是第一個,那麼第二個測試已經過時。 – Tom
@Tom嗯,我認爲StaticFieldContainer是Test類的'private static class'使得它清楚地表明它僅僅用於測試utils類。你難道不明白它爲什麼過時嗎? –
爲什麼你認爲你需要兩次測試這個特定的功能?你擔心第一次測試可能通過運氣嗎?如果你想測試你的類是否也可以讀取包私有變量,那麼你需要使用更好的測試方法名稱在第二種方法中測試它。 – Tom