在运行时更改guice实例的值

时间:2016-03-22 09:13:13

标签: java aop aspectj guice

我使用google guice注入此类示例

`Catchable Fatal Error: Argument 1 passed to Proxies\__CG__\Artel\ProfileBundle\Entity\Project::PreFlush() must be an instance of Doctrine\ORM\Event\LifecycleEventArgs, instance of Doctrine\ORM\Event\PreFlushEventArgs given, called in /home/ivan/host/aog-code/vendor/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php on line 102 and defined`

然后注入我的B级

 class A {
     String a;
 }

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

2 个答案:

答案 0 :(得分:1)

你在问题​​中提到 test 这个词 - 如果你正在为B编写 jUnit测试,你可以在@Before子句中执行注入,如所示{{ 3}}

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

答案 1 :(得分:1)

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

}