JUnit test ciągu fibonacciego

0

Potrzebuję pomocy z testem parametryzowanym. Nie rozumiem dlaczego pojawiają mi się te błędy przy takim kodzie:

@RunWith(Parameterized.class)
    public static class FibonacciTest {

        @Parameters(name = "{index}: fib({0})={1}")
        public static Iterable<Object[]> data() {
            return Arrays.asList(new Object[][] {
                    { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
            });
        }

        private int input;
        private int expected;

        public FibonacciTest(int input, int expected) {
            this.input = input;
            this.expected = expected;
        }

        @Test
        public void test() {
            Assertions.assertEquals(expected, Fibonacci.compute(input));
        }
    }

    public static class Fibonacci {
        public static int compute(int index){
            if (index == 0) return 0;
            if (index == 1) return 1;

            int prevPrev = 0;
            int prev = 1;
            int result = 0;

            for (int i = 2; i <= index; i++)
            {
                result = prev + prevPrev;
                prevPrev = prev;
                prev = result;
            }
            return result;
        }
    }

fibbonaci.png

2

Ty w ogóle wiesz co robisz?
Mutowalne zmienne do testów jako pola klasy, na metodzie testowej nie ma żadnych adnotacji o źródle danych....
Czytałeś jakiś tutorial do testów z parametrami czy robisz na pałę?

0

@Aleksander32: Tą odpowiedź mogę skomentować tak:
"Ty w ogóle wiesz co robisz?
Mutowalne zmienne do testów jako pola klasy, na metodzie testowej nie ma żadnych adnotacji o źródle danych....
Czytałeś jakiś tutorial do testów z parametrami czy robisz na pałę?"
Tutorial: https://www.testwithspring.com/lesson/writing-parameterized-tests-with-junit-4/
Wykorzystany w teście przez @RunWith(Parametrized.class) runner wymaga tych pól, konstruktora i takiej metody testowej.
Zgadzam się, że to jedna z opcji parametryzacji testów o której ludzkość powinna zapomnieć.

0

@kategoria000: A czy mógłbym prosić o całość klasy? Tam u góry są jednak jakieś importy. Może zwinięte przez IDE. Patrząc na to co jest dostępne i sposób w jaki zostało naprawione, powiedziałbym raczej, że zostało załatane. Przydałby się jeszcze zestaw zależnośći na których uruchamiany jest test. Wygląda na to, że został napisany test w JUnit4, w którym przypadkiem znalazła się anotacja z JUnit 5. Wyjątek, który poleciał pochodzi z JUnit 5. Więc mamy testy JUnit4 uruchomione na JUnit5 i tak samo jak importy może być bałagan z zależnościami.

0

Na szybko, działający przykład

Wykorzystaj sobie te wklepane liczby od 1 do 50 bo po co się męczyć ręcznie z wiki albo innym, źródłem

Test

mport org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@RunWith(Parameterized.class)
public class FibonacciTest {

    @Parameterized.Parameter()
    public int n;
    @Parameterized.Parameter(value = 1)
    public long result;

    @Parameterized.Parameters
    public static Collection<Object[]> data() {

        return Arrays.asList(new Object[][]{
                {0, 1L},
                {1, 1L},
                {2, 2L},
                {3, 3L},
                {4, 5L},
                {5, 8L},
                {6, 13L},
                {7, 21L},
                {8, 34L},
                {9, 55},
                {10, 89L},
                {11, 144L},
                {12, 233L},
                {13, 377L},
                {14, 610L},
                {15, 987L},
                {16, 1597L},
                {17, 2584L},
                {18, 4181L},
                {19, 6765L},
                {20, 10946L},
                {21, 17711L},
                {22, 28657L},
                {23, 46368L},
                {24, 75025L},
                {25, 121393L},
                {26, 196418L},
                {27, 317811L},
                {28, 514229L},
                {29, 832040L},
                {30, 1346269L},
                {31, 2178309L},
                {32, 3524578L},
                {33, 5702887L},
                {34, 9227465L},
                {35, 14930352L},
                {36, 24157817L},
                {37, 39088169L},
                {38, 63245986L},
                {39, 102334155L},
                {40, 165580141L},
                {41, 267914296L},
                {42, 433494437L},
                {43, 701408733L},
                {44, 1134903170L},
                {45, 1836311903L},
                {46, 2971215073L},
                {47, 4807526976L},
                {48, 7778742049L},
                {49, 12586269025L},
                {50, 20365011074L}
        });
    }

    @Test
    public void shouldCalculateFibonacciNumbers() {

        assertThat(Fibonacci.fibonacci(n), is(result));
    }
}

Kod

public class Fibonacci {

    private Fibonacci() {

    }

    public static long fibonacci(int n) {

        if (n < 2) {
            return 1;
        }

        long a = 1L;
        long b = 1L;
        long c = 0L;
        int i = 1;
        while (i < n) {
            c = a + b;
            b = a;
            a = c;
            i++;
        }

        return c;
    }
}
0

@lsikora:
package test;

import com.company.Ewidencja;
import org.junit.jupiter.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.NoSuchFileException;
import java.util.Arrays;
import java.util.Collection;

Faktycznie udało mi się rozwiązać problem z postu zamieniając "import org.junit.jupiter.api.Test" na "import org.junit.Test"

@BraVolt:
W twoim przykładzie wyrzuca mi błędy:
" Inner classes cannot have static declarations " - public static Collection<Object[]> data() {
" Cannot resolve method 'is' in 'FibonacciTest' " - assertThat(Fibonacci.fibonacci(n), is(result));
" Inner classes cannot have static declarations " - public static long fibonacci(int n) {

0

import org.junit.jupiter.api.Assertions; to nadal jest z JUnit 5. Więc mamy mieszaninę bibliotek. Jeśli chcesz po prostu przetestować ten kod, to się udało zmianą importu, przydało by się dodać parametry tak jak @BraVolt pokazał. Jeśli chcesz nauczyć się testowania ogólnie, lub jednego z frameworków do testowania, to warto wybrać jeden z nich.

2

Maven
pom.xml

    <dependencies>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
        </dependency>
    </dependencies>

plik test java, importy

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@kategoria000
Doprowadź sobie najpierw ten przykład do działania, a ewentualnie później zmieniaj wersję bibliotek na najnowsze

1 użytkowników online, w tym zalogowanych: 0, gości: 1