【问题标题】:Change value of guice instance on runtime在运行时更改 guice 实例的值
【发布时间】:2016-03-22 19:24:19
【问题描述】:

我正在使用 google guice 来注入这个类示例

 class A {
     String a;
 }

然后被注入到我的B类中

  class B {
     @Inject A aInstance;

     public void checkValue(){
            System.out.println(aInstance.a);
     }   
  }

也许使用 aspectJ,但我想要的是,我的一个测试会得到这个 A 实例并将“a”字符串设置为“foo”,然后再执行覆盖 B 类的测试,所以当B 类调用 checkValue 这个会打印“foo”

【问题讨论】:

  • 如果你得到相同的A 实例,那应该可以工作。我不太了解 guice,但我猜它有某种类似 CDI 的作用域,即它可能能够将一个类的同一个实例注入多个注入目标。
  • 这听起来像是一个模拟框架的任务。见 Mockito:mockito.org

标签: java aop aspectj guice


【解决方案1】:

您在问题中提到了 test 这个词 - 如果您正在为 B 编写 jUnit 测试,您可以在 @Before 子句中执行注入,如 @987654321 所示@。

private Injector injector;

@Before
public void init() throws Exception {
    injector = Guice.createInjector(new AbstractModule() {

        @Override
        protected void configure() {
            bind(A.class).to(MockedInstanceOfAWithValueFoo.class);
        }
    });
}

你也可以打电话

bind(A.class).toInstance(new MockedInstanceOfAWithValueFoo());

如果我们假设 A 有一个可以定义 A.a 的构造函数,则模拟实例可能如下所示:

public class MockedInstanceOfAWithValueFoo extends A{

    public MockedInstanceOfAWithValueFoo() {
        super("foo");
    }

}

同样,您可以让您的模拟类通过构造函数接受 A.a 的值,以使 B(以及 A.a 的关联值)的创建更加动态。

【讨论】:

  • 此代码未编译。至少我创建了一个模拟类
  • 哪个部分没有编译? 'MockedInstanceOfAWithValueFoo' 类不存在。您需要自己创建它。由于 A 不是接口,我想模拟实例将只是一个扩展 A 的类,并且可能通过设置器或构造器设置 A.a 字段。
  • 是的,当然,我创建了自己的模拟类。但你说得对,我忘了让模拟扩展 A。谢谢
  • 无论如何它不会那么简单,因为它不是单元测试而是 BDD 测试
【解决方案2】:

使用 Mockito:

import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class MyTest {

    @Mock
    A mockA;

    @InjectMocks
    B mockB;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
        mockA.a = "Foo";
        //when(mockA.getA()).thenReturn("Foo"); //if you use getter
    }

    @Test
    public void myTest() {
        assertNotNull(mockA);
        assertNotNull(mockA.a);
        assertNotNull(mockB);
        assertNotNull(mockB.ainstance);
        mockB.checkValue();
    }

}

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2021-12-26
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多