Тест Junit для ArrayList из ArrayLists - PullRequest
0 голосов
/ 26 августа 2018

Я новичок в Java. Я пытаюсь научиться на практике, и я обнаружил, что это упражнение имеет целью разделить список на подсписки размера n, принимаемые в качестве аргумента для раздела метода (ArrayList, size)

Например:
partition([1,2,3,4,],2) вернет ([1,2],[3,4])
partition([1,2,3,4,],3) вернет ([1,2,3],[4])

package partition;
import java.util.ArrayList;
import java.util.List;

public class Partition {


    public ArrayList<ArrayList> partition(List<Integer> li, int n) {
        ArrayList<ArrayList> al = new ArrayList();
        int start = 0;
        int i=n;
        for(; i<li.size(); i+=n){
            List<Integer> lis = li.subList(start, i);
            ArrayList<Integer> list = new ArrayList<>();
            list.addAll(lis);
            al.add(list);
            start = i;
        }

        if(i >= li.size()){
            List<Integer> lis = li.subList(start, li.size());
            ArrayList<Integer> list = new ArrayList<>();
            list.addAll(lis);
            al.add(list);
        }
        return al;
    }
}

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

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Ваш вариант использования является хорошим кандидатом для параметризованных тестов.
JUnit 5 действительно готов.Поэтому я рекомендую использовать его.
Общая идея модульных тестов заключается в определении сценариев: что у вас есть в качестве входных данных и что вы ожидаете.
В вашем вопросе вы успешно начали их определять.
НоХороший юнит-тест - это юнит-тест, который не оставляет дыр.Поэтому вам также необходимо идентифицировать и протестировать угловые случаи.
Вы можете, например, определить сценарии (не исчерпывающие, но дающие представление):

partition([1,2,3,4,],2) will return ([1,2],[3,4]) // nominal case
partition([1,2,3,4,],3) will return ([1,2,3],[4]) // nominal case
partition([1,2,3,4,],5) will return ()  // corner case
partition([],2) will return () // corner case

Теперь напишите для них тест:

import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

public class PartitionTest {

    @ParameterizedTest
    @MethodSource("partitionFixture")
    void partition(List<Integer> originalList, int partitionSize, List<List<Integer>> expectedListOfList) {
        ArrayList<ArrayList<Integer>> actualListOfList = new Partition().partition(originalList, partitionSize);
        Assertions.assertEquals(expectedListOfList, actualListOfList);
    }

    @SuppressWarnings("unused")
    private static Stream<Arguments> partitionFixture() {
        return Stream.of(Arguments.of(asList(1, 2, 3, 4), 2, asList(asList(1, 2), asList(3, 4))),
                         Arguments.of(asList(1, 2, 3, 4), 3, asList(asList(1, 2, 3), asList(4))),
                         Arguments.of(asList(1, 2, 3, 4), 5, asList()),
                         Arguments.of(asList(), 2, asList()));
    }

}
0 голосов
/ 26 августа 2018

Итак, вы написали свой класс и хотите проверить его, чтобы убедиться, что он действительно работает.Вот что вы можете сделать с модульным тестом:

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;

import static org.junit.Assert.assertEquals;

public class Tests {
    Partition sut = new Partition();

    @Test
    public void it_should_has_partition_size_2() {    
        ArrayList<ArrayList> partitioned = sut.partition(Arrays.asList(1,2,3,4),2);

        assertEquals(partitioned.size(), 2); // we expecting size to be 2
        assertEquals(partitioned.get(0), Arrays.asList(1,2,3)); // we know the first element should contains 1,2,3
    }

    @Test
    public void it_should_fail() {
        ArrayList<ArrayList> partitioned = main.partition(Arrays.asList(1,2,3,4),3);

        assertEquals(partitioned.size(), 2);
        // here it fails because we should expect partitioned.get(0) contains 1,2,3
        assertEquals(partitioned.get(0), Arrays.asList(1,2));
        /*
         * to pass this test we should use the below method
         * assertNotEquals(partitioned.get(0), Arrays.asList(1,2));
         */
    }
}

Когда вы запустите его, первый тест пройдет, а второй - не пройден.И это объясняет причину неудачи второго:

enter image description here

Зависимость Maven для junit:

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