java - JUnitParams - 在测试之前执行单独的方法

标签 java unit-testing junit junit4 junitparams

@RunWith(JUnitParamsRunner.class)
public class MySimpleTest {

    private MyRec rec;
    private Matrix matrix;

    @Before
    public void createRecognizerBeforeEveryExecution() {
        rec = new MyRec();
        matrix = MatrixUtils.createMatrixWithValues();
    }

    public static Iterable<Object[]> data() {
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

    @Test
    @Parameters(method = "data")
    public void test1(String output, String input) {
        rec.fun1(matrix);
        assertEquals(output, rec.someFunction(input));
    }

    public static Iterable<Object[]> data2() {
        return Arrays.asList(
                new Object[]{"expectedothervalue1", "input1"},
                new Object[]{"expectedothervalue2", "input2"}
        );
    }

    @Test
    @Parameters(method = "data2")
    public void test2(String output, String input) {
        rec.fun1(matrix);
        rec.fun2(matrix);
        assertEquals(output, rec.someFunction(input));
    }

}

我正在尝试找出进行此测试的正确方法。我想使用参数化测试,因为它真的很方便。

正如您所看到的,在每个测试函数中我都会调用一些函数(fun1fun2)。但我只需要在每次测试时调用它一次(例如,在每次参数化测试执行之前)。

有什么方法可以告诉 JUnitParams 在执行所有参数化测试之前应该执行其他函数吗?

我无法使用@Before注释,因为正如您在test1中看到的那样,我没有使用fun2。它认为它应该由单独的函数执行。

最佳答案

解决方案 1:

由于 fun[1|2] 不依赖于内部测试状态,因此尝试将它们的调用相应地放在 data 和 data2 方法中。

public static Iterable<Object[]> data() {
        rec.fun1(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

public static Iterable<Object[]> data2() {
        rec.fun1(matrix);
        rec.fun2(matrix);
        return Arrays.asList(
                new Object[]{"expectedvalue1", "input1"},
                new Object[]{"expectedvalue2", "input2"}
        );
    }

解决方案 2:

拆分测试用例不是最佳实践。您的测试更难维护。流程要复杂得多。您的测试启动还存在相互依赖的风险。有时重复测试会更好。

PS: 如果您使用字符串作为测试方法参数,最好按照此文件第 25 行中的方式传递它们: https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/SamplesOfUsageTest.java而不是特殊的方法。

@Test
@Parameters({"AAA,1", "BBB,2"})
public void paramsInAnnotation(String p1, Integer p2) { }

关于java - JUnitParams - 在测试之前执行单独的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35697293/

相关文章:

C# - 从项目的发布版本中排除单元测试

java - JUnit 测试 - 应该通过预期结果的测试有什么问题?

java - @Mock 对象实例为空

java - 站点间通信 : How to communicate authenticate users registered on Site A to/with Site B?

java - Java 中是否可以从其参数中的对象启动线程?

java - 设置 Spring Boot Servlet 初始化程序时遇到问题

java - 模拟和 stub 之间有什么区别(JMock)

unit-testing - 是否有确凿的证据证明单元测试的投资返回率?

swift - Carthage + Quick 框架 + Swift 2 = "error: module file was created by an older version of the compiler; rebuild ' Quick',然后重试”

java - Serenity BDD 入门