這是一種假設(shè)情況。我使用 int 作為類型,但您可以自由地將其替換為您選擇的任何類型,這是一個關(guān)于如何編寫確認沒有人更改方法簽名的測試的問題。我編寫了一個方法,它對整數(shù)非常有效,但如果它接收到某些非整數(shù),將產(chǎn)生非常難以追蹤的錯誤。我想避免錯誤,所以我編寫了一些測試來確認該方法是否正常工作。我正在用 Java 編寫,所以我可以愉快地依賴 Java 的強類型。然而,總有一天,有人會想改變這種方法來接受一些非整數(shù)(可能是我),有時它會起作用(我會為自己感到驕傲)。他們(我)甚至可能編寫一些測試來添加到他們改進的方法版本中,并且這些測試將通過,除非它們通過某些非整數(shù)。是否可以編寫一個測試來確認方法簽名沒有改變?我已經(jīng)嘗試過了,但myClass.multiply(2.0, 2);沒有編譯,所以我無法運行測試。import org.junit.Assert;import org.junit.Test;import static org.junit.Assert.fail;public class TestingCoercion { @Test public void multiply2x2() { MyClass myClass = new MyClass(); Assert.assertEquals(myClass.multiply(2, 2), 4); } @Test public void multiplyDoesNotWorkWithFloat() { MyClass myClass = new MyClass(); try { myClass.multiply(2.0, 2); //this line does not compile fail("MyClass.multiply is only for integers"); } catch (Exception exception) { Assert.assertTrue("MyClass.multiply correctly rejected a double", true); } } class MyClass { public int multiply(int i, int j) { return i * j; } }}
1 回答

月關(guān)寶盒
TA貢獻1772條經(jīng)驗 獲得超5個贊
一種方法是使用反射來查找具有特定參數(shù)列表的特定方法。
你可以這樣做:
try {
MyClass.class.getMethod("multiply", int.class, int.class);
} catch (NoSuchMethodException) {
// test has failed.
fail(); //do not swallow this exception, fail the test
}
getMethodNoSuchMethodException如果沒有具有該確切參數(shù)列表的方法,將拋出一個。
如果您還想檢查是否沒有人添加了您將來可能不小心調(diào)用的另一個重載,您也可以:
assertEquals(1, Arrays.stream(MyClass.class.getMethods()).filter(x -> x.getName().equals("multiply")).count());
添加回答
舉報
0/150
提交
取消