Как выполнить параметризованные тестовые примеры Junit - PullRequest
0 голосов
/ 04 ноября 2018

Я изучаю параметризованные тестовые примеры Junit, пытаюсь получить пользователя по Id. при выполнении этого я получаю ошибку: "Java.lang.IllegelArgumentException: неверное количество аргументов." подскажите пожалуйста что не так с этим кодом.

   @RunWith(Parameterized.class)
public class UserTestCases {

@Mock
UserRepository userRepository;

@InjectMocks
private UserServiceImpl userService;

private User user;
private User expectedUser;

public UserTestCases(User user, User expectedUser) {
    super();
    this.user = user;
    this.expectedUser = expectedUser;
}

@Parameters
public static Collection input() {
    User u1=new User(1, "india", "shiva");
    User u2=new User(2, "india", "shiva");
    User u3=new User(3, "india", "shiva");


    return Arrays.asList(new Object[][] {{new User(1L, "india", "shiva"), u1}, {new User(2, "india", "shiva"), u2},{new User(3, "india", "shiva"), u3}});

}

@Test
public void getUserByIdtest() {

        when(userRepository.findOne(user.getId())).thenReturn(user);
        User result=userService.findById(user.getId());
        assertEquals(user.getCountry(), expectedUser.getCountry());
        assertEquals(user.getName(), expectedUser.getName());
}
}

Заранее спасибо

1 Ответ

0 голосов
/ 04 ноября 2018

Если вы учитесь использовать JUnit, возможно, вы можете попробовать последнюю версию: JUnit5.

Эта последняя версия упрощает составление внешних функций, таких как макетирование, генерация тестов, загрузка Spring-компонентов и т. Д.

Более того, он как встроенная поддержка параметризованных методов (тестов), тогда как JUnit4 как только параметризованные классы (наборы тестов) и был необходим JUnitParams и его Runner для поддержки параметризованных тестов.

Ваш тест можно записать так в JUnit5:

@ExtendWith(MockitoExtension.class)
class UserTestCases {

    @Mock UserRepository userRepository;
    @InjectMocks UserServiceImpl userService;

    @ParameterizedTest
    @MethodSource("input")
    void getUserByIdtest(User user, User expectedUser) {
        when(userRepository.findOne(user.getId())).thenReturn(user);
        User result = userService.findById(user.getId());
        assertEquals(user.getCountry(), expectedUser.getCountry());
        assertEquals(user.getName(), expectedUser.getName());
    }

    static Stream<Arguments> input() {
        return Stream.of(
            // static method of Arguments
            arguments(
                new User(1, "india", "shiva"),
                new User(1L, "india", "shiva")),
            arguments(
                new User(2, "india", "shiva"),
                new User(2L, "india", "shiva")),
            arguments(
                new User(3, "india", "shiva"),
                new User(3L, "india", "shiva")),
        );
    }
}

Однако этот тест только о делегировании от UserServiceImpl до UserRepository, поэтому здесь вам не нужны параметризованные тесты.

Единственный тест, который необходим, если вы хотите проверить делегирование (кажется, без отображения), это что-то вроде:

class UserTestCases {
    @Mock UserRepository userRepository;
    @InjectMocks UserServiceImpl userService;

    @Test
    void getUserByIdtest() {
        User user = mock(User.class);
        when(userRepository.findOne(any())).thenReturn(user);

        assertEquals(userService.findById(1L), user);
    }
}

В таком тесте используются библиотеки JUnit5 и Mockito. Если вы используете Maven, ваш POM может выглядеть примерно так:

<properties>
    <junit-jupiter.version>5.3.1</junit-jupiter.version>
    <mockito.version>2.23.0</mockito.version>
    <surefire-plugin.version>2.22.1</surefire-plugin.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit-jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>${mockito.version}</version>
        <scope>test</test>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire-plugin.version}</version>
        </plugin>
    </plugins>
</build>

Надеюсь, это поможет!

...