java - Junit参数化设置测试类中的常量

标签 java junit

我正在尝试运行参数化的 junit 测试,其中参数在测试中必须保持不变,因此我使用反射来设置该参数。然而它并不太有效。在下面的示例中,它始终打印 Testing with: param-1。我该如何解决这个问题?令人惊讶的是,我在调试器中为不同的运行实例获得了正确的 PARAM_NAME (param-1、param-2、param-2)值,但它在控制台上始终打印为“param-1”,并且在测试中也用作“param-1”。这可以部分解释为注释是在编译时评估的,因此注释中的值在运行时不能更改?

@RunWith(Parameterized.class)
public class SomeTest {

private final String PARAM_NAME = "param-1";

public SomeTest(String someParam){
    org.springframework.test.util.ReflectionTestUtils.setField(this, "PARAM_NAME", someParam);
}

@Parameterized.Parameters
public static Collection parameters() {
    return Arrays.asList(new Object[][] {
            { "param-1" },
            { "param-2" },
            { "param-3" }
    });
}

@Test
@ExternalAnnotation(PARAM_NAME) //needs constant in annotation
public void testSomething() throws Exception {
    System.out.println("Testing with: "+PARAM_NAME); //always prints param-1
    //some tests
    }
}

最佳答案

注释值由 JVM 缓存,您无法在运行时更改它。我能想到的实现您想要做的事情的唯一可能的方法是通过源代码生成以编程方式生成测试类(基于模板,或使用像 JCodeModel 这样的库)。如果您在测试编译之前的生命周期阶段执行此操作(假设您使用的是 Maven 或 Gradle 等构建系统),那么您应该相对容易地启动和运行。

关于java - Junit参数化设置测试类中的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47195465/

相关文章:

java - 如何为未捕获的线程异常处理程序编写单元测试。

java - 是否可以使用 || java代码的junit测试中的运算符?

java - 从servlet执行oracle查询结果错误

java - GSON:如何从 json 解码为忽略对象的模型?

java - 谷歌 gson fromjson() TypeToken

java - 单元测试图形

unit-testing - 如何包含注释处理器生成的代码来测试 Java/Kotlin 中的类路径

java - jMockit 初始化错误 : java. lang.IllegalStateException:在 JDK 9 上运行

Java反射丢失注解信息

java - 使用类的对象调用另一个类的方法