在运行时更改 guice 实例的值



我正在使用谷歌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"

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

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 的相关值)的创建更加动态。

with 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();
    }
}

最新更新