如何执行参数化Junit测试用例

湿婆

我正在学习参数化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());
}
}

提前致谢

Loïc院长

如果您正在学习使用JUnit,也许您可​​以尝试使用最新版本:JUnit5。

最新版本使组合外部功能(例如模拟,生成测试用例,加载Spring Bean等)变得更加容易

而且,它作为对参数化方法(测试)的内置支持,而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>

希望这可以帮助 !

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章