代码之家  ›  专栏  ›  技术社区  ›  Glen Pierce

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

  •  0
  • Glen Pierce  · 技术社区  · 7 年前

    这是一种假设情况。我使用int作为类型,但是您可以自由地用您选择的任何类型替换它,这是一个关于如何编写一个测试来确认没有人更改方法签名的问题。

    我已经编写了一个方法,它可以很好地处理整数,但是如果它接收到某些非整数,就很难找到错误。我想避免bug,所以我已经编写了一些测试来确认方法是否正确工作。我用Java编写,所以我可以很高兴地依赖Java的强类型。然而,总有一天,有人会想改变这个方法来接受一些非整数(可能是我),它会起作用,有时(我会为自己感到骄傲)。他们(I)甚至可以编写一些测试来添加到他们改进的方法版本中,并且这些测试将通过,除非它们通过某些非整数。

    我试过了,但是 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 回复  |  直到 7 年前
        1
  •  0
  •   Glen Pierce    7 年前

    你可以这样做:

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