【问题标题】:How to perform Parameterized Junit Test Cases如何执行参数化 Junit 测试用例
【发布时间】:2018-11-04 06:36:47
【问题描述】:

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

提前致谢

【问题讨论】:

标签: junit parameterized


【解决方案1】:

如果你正在学习使用 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")),
        );
    }
}

但是,这个测试只是从UserServiceImplUserRepository 的委托,所以这里不需要参数化测试。

如果您想检查委托(似乎没有映射),唯一需要的测试是:

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>

希望这会有所帮助!

【讨论】:

  • 能否请您在此处粘贴这些注释的依赖项
  • return Stream.of( arguments ( new User(1, "india", "shiva"), new User(1L, "india", "shiva")), arguments 没有解析。
  • Arguments类的静态方法,添加import static org.junit.jupiter.params.provider.Arguments.arguments
猜你喜欢
  • 2018-04-23
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多