【问题标题】:JUNIT: ReflectionTestUtils : I need to inject a class in a super class for testingJUNIT:ReflectionTestUtils:我需要在超类中注入一个类进行测试
【发布时间】:2021-05-27 15:36:29
【问题描述】:

我正在测试一个扩展抽象类 B 的类 A。B 类有一个私有成员 M,我想设置它以进行测试。

  1. 据我所知,问题的第一部分是从 A 类中检索 B 类。为此我尝试了 getSuperclass,我认为这可能不是正确的方法。虽然,我可以使用 ``ReflectionTestUtils.findfield()``` 检索所需的字段,但不能使用设置字段。
  2. 其次,当我尝试设置字段 (ReflectionUtils.setField(field_M, B, M_to_be_set)) 时,它基本上以以下异常结束: java.lang.IllegalArgumentException:无法将 M 字段 M 设置为 java.lang.Class 我尝试设置字段,但无法找到字段本身。

谢谢

【问题讨论】:

  • 你正在尝试这个单元测试吗?如果是这样,你应该模拟 B,否则你是集成测试。在实际工作的应用程序中如何设置 B 的私有成员?如果您是真正的集成测试,那么该依赖关系显然是集成上下文的一部分,并且首先应该包含私有成员的任何集合并独立于 A 进行测试。它将作为 B 与任何集合之间集成的一部分进行测试首先是私有成员。

标签: java unit-testing testing junit reflection


【解决方案1】:

您似乎向 setField() 方法传递了错误的参数。以下解决方案对我有用。您能否检查并确认它是否解决了您的问题?

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;

public class TestClass {

    @Test
    public void test1() {
        ClassA a = new ClassA();

        ReflectionTestUtils.setField(a, "m", "value");

        Object f = ReflectionTestUtils.getField(a, a.getClass().getSuperclass(), "m");

        assertEquals("value", f.toString());
    }

}

abstract class ClassB {
    private String m;
}


class ClassA extends ClassB {

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多