我有一个带有 RuntimeException 的 Junit4 测试“应该没有参数”用于参数化测试

问题描述

我正在使用 Junit4 和 JunitParams 的外部 jar 运行一些代码

据我所知,我的代码设置正确,导入也全部正确……但我的测试方法不断抛出运行时异常,因为它似乎忽略了其中的 @Parameters 注释。>

当它到达我正在测试的方法时,它一直说“java.lang.Exception: Method ----- should have no parameters”

我不确定问题是什么,即使其他人遇到了混合/匹配导入语句等问题。我检查了我的,这里似乎不是这种情况。

测试运行器类:

package Chapter8.Wrappers.Tests;

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
    public static void main(String[] args){

        Result result = JUnitCore.runclasses(StringProcessorTest.class);

        for(Failure failures: result.getFailures()) {
            System.out.println(failures.toString());
        }
        System.out.println(result.wasSuccessful());
    }
}

和我的测试类 StringProcessorTest :

package Chapter8.Wrappers.Tests;

import Chapter8.Wrappers.Challenges.Backwardsstring.StringProcessor;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Collection;

@RunWith(JUnitParamsRunner.class)
public class StringProcessorTest {

    private StringProcessor processor;
    private final String expectedResult;
    private final String inputString;

    public StringProcessorTest(String inputString,String expectedResult){
        super();
        this.inputString = inputString;
        this.expectedResult = expectedResult;
    }

    @Before
    public void initialize(){
        processor = new StringProcessor();
    }

    @Parameters
    public static Collection stringValues(){
        return Arrays.asList(new Object[][] { {"HELLO","OLLEH"},{"TESTING","GNITSET"} });
    }

    @Test
    public void objectConstructor_InitializeStringBuilderInside_EqualsPassedString(String inputString,String expectedResult){

        Object input;

        input = inputString;

        processor = new StringProcessor(input);

        Assert.assertEquals(expectedResult,processor.printReverseString());

    }
}

控制台输出

Chapter8.Wrappers.Tests.StringProcessorTest: java.lang.Exception: Method objectConstructor_InitializeStringBuilderInside_EqualsPassedString should have no parameters
false

Process finished with exit code 0

解决方法

我发现了一些最终奏效的东西 - 我将 @RunWith 注释的内部更改为

Parameterized.class

结果我试图将参数传递给@Test注解下的方法,而不仅仅是我的StringProcessorTest类的构造函数;我从被测方法中删除了它们。它已经警告我了,但我不明白为什么更早。

当我重新运行它时,它顺利完成并运行了两次。

,

我认为您有两种选择来解决您的问题:

  1. @Parameters 方法中删除 stringValues() 注释并将其添加到您的测试方法中,如下所示:
private List stringValues(){
    return Arrays.asList(new Object[][] { {"HELLO","OLLEH"},{"TESTING","GNITSET"} });
}

@Test
@Parameters(method = "stringValues")
public void objectConstructor_InitializeStringBuilderInside_EqualsPassedString(String inputString,String expectedResult) {
    processor = new StringProcessor(inputString);
    
    Assert.assertEquals(expectedResult,processor.printReverseString());
}

  1. 删除 stringValues() 方法并将 @Parameters 注释直接放在您的测试方法上:
@Test
@Parameters({ "HELLO,OLLEH","TESTING,GNITSET" })
public void objectConstructor_InitializeStringBuilderInside_EqualsPassedString(String inputString,processor.printReverseString());
}