我使用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”
答案 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();
}
}