Тест, подтверждающий, что подпись метода не была изменена? - PullRequest
0 голосов
/ 13 февраля 2019

Это гипотетическая ситуация.Я использую int в качестве типа, но вы можете свободно заменить его любым типом по вашему выбору, это вопрос о том, как написать тест, который подтверждает, что никто не изменил сигнатуру метода.

Я написал метод, который очень хорошо работает с целыми числами, но будет очень трудно отследить ошибки, если он когда-либо получит определенные нецелые числа.Я хочу избежать ошибок, поэтому я написал несколько тестов, чтобы подтвердить, что метод работает правильно.Я пишу на 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;
        }
    }
}

1 Ответ

0 голосов
/ 13 февраля 2019

Одним из способов является использование отражения, чтобы найти определенный метод с определенным списком параметров.

Вы можете сделать что-то вроде этого:

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