Использование тестового класса для проверки соответствия двух целых значений аргументам

#java

#java

Вопрос:

Если для двух значений установлено значение от 0 до 29, если число, указанное в аргументе, является суммой этих двух чисел, а номер аргумента и номер экземпляра совпадают.

вот код, который я написал до сих пор:

 public class TwoNumbers {
      private int firstnum = 0;
      private int secondnum = 0;

//Constructor that initialize the first and second number
//to a value of 0

    public TwoNumbers()
    {
            firstnum = 0;
            secondnum = 0;
    }

    public int getFirstNum(){
            return firstnum;
    }
    public int getSecondNum(){
            return secondnum;
    }


    public boolean setFirstNum (int firstnum){
            if (firstnum >= 0 amp;amp; firstnum <=29){
                    return true;
            }
            else {
                    return false;
            }
    }
    public boolean setSecondNum (int secondnum)
    {

            if (secondnum >= 0 amp;amp; secondnum <=29){
                    return true;
            }
            else {
                    return false;
            }
    }
    public boolean checkSum (int sum){
            if (sum == firstnum   secondnum){
                    return true;
            }
            else {
                    return false;
            }

    }
    public boolean equals (int numbers1) {
            if (firstnum == secondnum){
                    return true;
            }
            else{
                    return false;
            }
            }
    }
  

Ответ №1:

Ваши установщики не устанавливают новые значения.

 public boolean setFirstNum (int newValue){
            firstnum = newValue;
            if (firstnum >= 0 amp;amp; firstnum <=29){

                return true;
        }
        else {
                return false;
        }
}
public boolean setSecondNum (int newValue)
{
        secondnum = newValue;
        if (secondnum >= 0 amp;amp; secondnum <=29){
                return true;
        }
        else {
                return false;
        }
  

и тесты 14 и 15 не проверяют значение чисел.
return numbers1.equals(numbers2); вместо этого следует читать
return numbers1.firstNumber == numbers2.firstNumber amp;amp; numbers1.secondNumber == numbers2.secondNumber;

Комментарии:

1. должен ли я установить их следующим образом firstnum = 0 и secondnum = 0

2. Я рекомендую изменить имена ваших аргументов, чтобы сделать ваш код более разборчивым, т.Е.: public boolean setFirstNum (int newValue)

3. Нет, вам нужно установить для них значения, которые вы передаете в методах setFirstNum и setSecondNum.

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

5. но метод имеет логический тип, ему нужно возвращаемое значение? для true и false

Ответ №2:

Несколько предложений для вас:

  • Вам следует использовать JUnit, а не создавать свой собственный механизм тестирования. Вместо того чтобы возвращать логические значения и печатать сообщения об ошибках, вы могли бы иметь очень четкие тестовые инструкции, такие как assertEquals("default num1 is zero", 0, new TwoNumbers().getFirstNum())
  • Содержите ваши методы получения и установки в чистоте: средства получения должны просто возвращать значение, а средства установки должны просто устанавливать значение.
  • Если есть условие ошибки, такое как аргумент, находящийся за пределами ожидаемого диапазона, тогда выбрасывайте и исключайте, а не возвращайте логическое значение.
  • Проведите модульные тесты, подтверждающие, что правильные исключения генерируются при правильных условиях (используя expected ключ аннотации JUnit).

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

Ответ №3:

Я думаю, вам следует проверить значения, которые вы установили.

 public static boolean test15() {
        TwoNumbers numbers1 = new TwoNumbers();
        numbers1.setFirstNum(1);
        numbers1.setSecondNum(4);

        TwoNumbers numbers2 = new TwoNumbers();
        numbers2.setFirstNum(4);
        numbers2.setSecondNum(1);

        return numbers1.equals(numbers2);
}
  

В случае с номером 15 вы проверяете, что 1 равно 4. Следовательно, он возвращает false , и в этом тестовом примере нет ничего плохого.

Измените его с помощью:

 numbers2.setFirstNum(1);
numbers2.setSecondNum(4);
  

В случае № 2 вы не установили secondNum , но пытаетесь проверить это, поэтому он возвращается false .

 public static boolean test2() {
        TwoNumbers numbers = new TwoNumbers();
        boolean success = numbers.setFirstNum(1);
        return success amp;amp; (numbers.getFirstNum() == 1) amp;amp; (numbers.getSecondNum() == 0);
}
  

Добавьте строку ниже:

 boolean success = numbers.setSecondNum(0);
  

В случае с номером 6 вы не установили firstNum , но пытаетесь его проверить, поэтому он также возвращает false .

 public static boolean test6() {
        TwoNumbers numbers = new TwoNumbers();
        boolean success = numbers.setSecondNum(1);
        return success amp;amp; (numbers.getFirstNum() == 0) amp;amp; (numbers.getSecondNum() == 1);
}
  

Добавьте строку ниже:

 boolean success = numbers.setFirstNum(0);
  

Я понял вашу ошибку, когда посмотрел случай № 14.. Ваши методы установки не устанавливают значения. Они просто возвращают false или true. Пожалуйста, обновите их, как показано ниже:

 public boolean setFirstNum (int firstnum) {
    if (firstnum >= 0 amp;amp; firstnum <=29) {
            this.firstnum = firstnum;
            return true;
    } else {
            return false;
    }
}

public boolean setSecondNum (int secondnum) {
    if (secondnum >= 0 amp;amp; secondnum <=29) {
            this.secondnum = secondnum;
            return true;
    } else {
            return false;
    }
}
  

Комментарии:

1. да, но он все равно должен пройти, потому что он проверит, что 1 не равно 4

2. Нет, к сожалению, вы ошибаетесь. Поскольку результат равен false, то выводится сообщение «сбой»..

3. итак, я обновил setSecondNum следующим образом: ` public boolean setFirstNum (int firstnum){ secondnum = 0; if (firstnum >= 0 amp;amp; firstnum <= 29){ return true; } else { return false; } }` но все еще не прошел второй тест

4. добавить логическое значение success = numbers.setSecondNum(0); к методу setSecondNum?

5. Не могли бы вы еще раз проверить мой окончательный ответ

Ответ №4:

как прокомментировал @GlenPierce, но с некоторыми изменениями

 public boolean setFirstNum (int firstnum){
        if (firstnum >= 0 amp;amp; firstnum <=29){
                return true;
        }
        else {
                return false;
        }
}
public boolean setSecondNum (int secondnum)
{

        if (secondnum >= 0 amp;amp; secondnum <=29){
                return true;
        }
        else {
                return false;
        }
}
  

должно быть

 public boolean setFirstNum (int firstnum)
{

        if (firstnum >= 0 amp;amp; firstnum <=29){
        this.firstnum = firstnum; //this is to set the value for TwoNumbers class in your object
                return true;
        }
        else {
                return false;
        }
}
public boolean setSecondNum (int secondnum)
{

        if (secondnum >= 0 amp;amp; secondnum <=29){
        this.secondnum = secondnum; //this is to set the value for TwoNumbers class in your object
                return true;
        }
        else {
                return false;
        }
}
  

и теперь это будет работать нормально.

даже если вы получаете true или false из класса TwoNumbers. В вашем экземпляре значение всегда будет равно нулю без установки их в setFirstNum и setSecondNum.

используйте ключевое слово this, чтобы задать их. Это всего лишь одно из решений, есть еще другие способы, подобные тому, что сделал @GlenPierce.

для 14 и 15

 // testing equals()
public static boolean test14() {
    TwoNumbers numbers1 = new TwoNumbers();
    numbers1.setFirstNum(1);
    numbers1.setSecondNum(4);

    TwoNumbers numbers2 = new TwoNumbers();
    numbers2.setFirstNum(1);
    numbers2.setSecondNum(4);

    return numbers1.equals(numbers2);
}

public static boolean test15() {
    TwoNumbers numbers1 = new TwoNumbers();
    numbers1.setFirstNum(1);
    numbers1.setSecondNum(4);

    TwoNumbers numbers2 = new TwoNumbers();
    numbers2.setFirstNum(4);
    numbers2.setSecondNum(1);

    return numbers1.equals(numbers2);
}
  

это приведет к сбою, потому что ваша логика неверна. метод in .equal вашего TwoNumbers принимает int, пока вы передаете весь объект.

измените 14 и 15 и равный метод на это, и все будет хорошо

 // testing equals()
public static boolean test14() {
    TwoNumbers numbers1 = new TwoNumbers();
    numbers1.setFirstNum(1);
    numbers1.setSecondNum(4);

    TwoNumbers numbers2 = new TwoNumbers();
    numbers2.setFirstNum(1);
    numbers2.setSecondNum(4);

    return numbers1.equals(numbers2.secondnum);
}

public static boolean test15() {
    TwoNumbers numbers1 = new TwoNumbers();
    numbers1.setFirstNum(1);
    numbers1.setSecondNum(4);

    TwoNumbers numbers2 = new TwoNumbers();
    numbers2.setFirstNum(4);
    numbers2.setSecondNum(1);

    return numbers1.equals(numbers2.secondnum);
}

public boolean equals (int numberYouPassed) {

        //firstnum is the value from your numbers1
        //numberYouPassed is the value from numbers2.secondnum that you passed

        if (firstnum == numberYouPassed){  
                return true;
        }
        else{
                return false;
        }
        }
}
  

Комментарии:

1. это помогло пройти только тест 2. Теперь тест 8 не выполняется с использованием этого.

2. я все еще пытаюсь просмотреть ваш код. по крайней мере, мы ответили на одну из ваших проблем 🙂 давайте сделаем это по одному. хе-хе . просто подождите, и я обновлю ответ mmy

3. нет проблем. Я думаю, может быть, использование this поможет с этим решением, нет?

4. как вы думаете, сработает ли изменение его на firstnum < 0 amp;amp; firstnum > 29 и возврат true, а else как false?

5. нет. ваша логика кода верна. не меняйте его на firstnum < 0 amp;amp; firstnum > 29, потому что это вернет false . Я уже изменил свой ответ. Я забыл поместить i t внутри в if. теперь он будет работать должным образом для 8 🙂