这是一种假设情况。我使用int作为类型,但是您可以自由地将其替换为您选择的任何类型,这是一个有关如何编写可确认没有人更改方法签名的测试的问题。
我编写了一种非常适合整数的方法,但是如果它接收到某些非整数,将很难发现错误。我想避免错误,因此我编写了一些测试来确认该方法正确运行。我正在用Java编写程序,因此我可以愉快地依靠Java的强类型。但是,总有一天,有人会想要更改此方法以接受一些非整数的人(可能是我),并且有时会奏效(我会为自己感到骄傲)。他们甚至可能编写一些测试以添加到方法的改进版本中,除非这些测试通过某些非整数,否则这些测试将通过。
是否可以编写一个确认方法签名未更改的测试?
我已经尝试过了,但是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;
}
}
}
答案 0 :(得分:0)
一种方法是使用反射来查找具有特定参数列表的特定方法。
您可以执行以下操作:
try {
MyClass.class.getMethod("multiply", int.class, int.class);
} catch (NoSuchMethodException) {
// test has failed.
fail(); //do not swallow this exception, fail the test
}
如果没有使用确切参数列表的方法, getMethod
将抛出NoSuchMethodException
。
如果您还想检查是否没有人添加另一个您将来可能会意外调用的重载,则也可以:
assertEquals(1, Arrays.stream(MyClass.class.getMethods()).filter(x -> x.getName().equals("multiply")).count());