确认方法签名未更改的测试



这是一种假设情况。我使用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;
}
}
}

一种方法是使用反射来查找具有特定参数列表的特定方法。

你可以这样做:

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());

最新更新