Нужна помощь с тестированием JUnit

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

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class PrimeNumbers implements Iterable<Integer> {
    private List<Integer> primes = new ArrayList<Integer>();

    /*
     * creates a list of n prime numbers
     *
     * @param n - the number of primes to compute silently treats negative
     * arguments as zero
     */
    public void computePrimes(int n) {
        int count = 1; // count of primes
        int number = 2; // number tested for primeness
        boolean isPrime; // is this number a prime

        while (count <= n) {
            isPrime = true;
            for (int divisor = 2; divisor <= number / 2; divisor++) {
                if (number % divisor == 0) {
                    isPrime = false;
                    break; // for loop
                }
            }
            if (isPrime && (number % 10 != 9)) { // THIS IS THE FAULT!!!
                primes.add(number);
                count++;
            }
            number++;
        }
    }

    @Override
    public Iterator<Integer> iterator() {
        return primes.iterator();
    }

    @Override
    public String toString() {
        return primes.toString();
    }

}

и вот мой тестовый класс:

import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static org.junit.Assert.*;

public class PrimeNumbersTest {

    @Test
    public void test(){
        //instantiate prime object, create primes list, and iterator
        PrimeNumbers prime = new PrimeNumbers();
        List<Integer> primeList = new ArrayList<Integer>();

        //array holding 19 so I can compare the objects
        int[] primeArray = new int[]{2,3,5,7,11,13,17,19};
        int i = 0;
        int n = 8;
        //call the method
        prime.computePrimes(n);
        Iterator<Integer> primeIterator = primeList.iterator();
        //loop to iterate through the list and then check last item if it is equal to 19
        while(primeIterator.hasNext()){
            if (!(primeIterator.equals(primeArray[i]))) {
                assertTrue("incorrect", primeIterator.equals(primeArray[i]));
            }
            i++;
            primeIterator.next();
        }
    }
}

Спасибо ребята за помощь!

Ничто явно не указывает тесту на провал, вы уверены, что выполняемый код действительно выполняет строку, содержащую assertTrue("incorrect", primeIterator.equals(primeArray[i])); ?

Patrick Magee 25.03.2019 00:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Взгляните на эти две строки:

List<Integer> primeList = new ArrayList<Integer>();
...
Iterator<Integer> primeIterator = primeList.iterator();

Вы создаете пустой список, а затем проверяете содержимое списка это. Поскольку в этом списке ничего нет, ваш код никогда не входит в цикл while и, следовательно, тестовое утверждение никогда не вызывается.

Если заменить это...

Iterator<Integer> primeIterator = primeList.iterator();

... с этим ...

Iterator<Integer> primeIterator = prime.iterator();

... тогда вы будете тестировать итератор, созданный вашим классом PrimeNumbers. Это должно быть то, что вы хотите сделать, хотя следует отметить, что этот вызов всегда будет возвращать false: primeIterator.equals(primeArray[i]) (поскольку он сравнивает итератор, а не значение внутри итератора, с «ожидаемым» массивом), поэтому ваш тест не будет выполнен. на его первой итерации по циклу while. Это будет ложноотрицательным.

Похоже, вы пытаетесь доказать, что PrimeNumbers (который был закодирован как нет возвращает 19) не возвращает 19, когда его просят вернуть первые 8 простых чисел. Если это так, то следующий может быть более компактным и конкретным способом сделать это:

@Test
public void test() {
    //instantiate prime object, create primes list, and iterator
    PrimeNumbers prime = new PrimeNumbers();

    int n = 8;
    int unexpectedPrimeNumber = 19;

    // call the method
    prime.computePrimes(n);

    // gather the generated prime numbers into a list for easier assertion
    List<Integer> primeList = new ArrayList<>();
    prime.iterator().forEachRemaining(integer -> primeList.add(integer));

    assertEquals("Should contain " + n + " prime numbers!", n, primeList.size());
    assertFalse("Should not contain the unexpected prime number: " + unexpectedPrimeNumber, primeList.contains(unexpectedPrimeNumber));
}

Другие вопросы по теме