gpt4 book ai didi

java - 确认方法签名未被更改的测试?

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:38 25 4
gpt4 key购买 nike

这是一个假设的情况。我使用 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());

关于java - 确认方法签名未被更改的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54663531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com