在测试环境中使用全局变量

时间:2020-05-14 04:21:02

标签: java junit mockito guice

在这种特殊情况下,我需要知道是否可以在API上使用全局变量

我在lib中有一个类(我无权访问),女巫读取了消息队列(如kafka或Rabbit)并发布了弹性搜索

示例:

public Class MessageQueue(message) {
    if (isValid(c)) {
        // post in kibana
        onDelivered(message)
    }
}

我需要扩展此类以添加功能

public Class MessageQueueService extends MessageQueue {

    UserRestService userRestService;

    User user;

    @Inject
    public void MessageQueueService(UserRestService userRestService) {
        this.userRestService = userRestService;
    }

    public boolean isValid(message) {
        // first a made if's to discard the message with the message info, to avoid the API call

        //if the message is Valid here
        user = userRestService.get(message.getId);

        //more validation
    }

    public void onDelivered(message) {

        // bunch of code with the user info like: 
        doStaff(user);

        return;
    }
}

我的问题是,使用全局变量 user 的正确方法是什么,因为由于无法结束不使用此请求,我无法在构造函数中进行初始化。而且使用单例违反我认为的规则。

当我尝试对de onDelivered方法进行单元测试时失败,因为我无法模拟User全局变量,而我有点迷失了。

我正在将Java与Guice和JUnit和Mockito一起进行测试!谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用Java反射来做到这一点

@Test
    public void shouldDoSomething() throws Exception {
        Field field = targetTestObject.getClass().getDeclaredField("shipment");
        field.setAccessible(true);
        field.set(targetTestObject, user);
    }