Java 在测试中模拟EJB注入
每当我想测试一个使用资源注入的类时,我最终会包括一个只在测试中使用的构造函数:Java 在测试中模拟EJB注入,java,junit,ejb,easymock,Java,Junit,Ejb,Easymock,每当我想测试一个使用资源注入的类时,我最终会包括一个只在测试中使用的构造函数: public class A { @EJB B b; // Used in tests to inject EJB mock protected A(B b) { this.b = b; } public A() {} // Method that I wish to test public void foo() {
public class A {
@EJB
B b;
// Used in tests to inject EJB mock
protected A(B b) {
this.b = b;
}
public A() {}
// Method that I wish to test
public void foo() {
b.bar();
}
}
有没有其他模拟资源注入的方法,或者这是正确的模式
如果输入B
where接口,那么您就不会“仅仅”为测试用例执行它;您将允许“B的行为”的任何替代实现,即使对它/它们的需求还没有被构想出来
是的,基本上这是唯一可以遵循的模式。。。所以(正确或错误地)你不妨充分利用它;-)
干杯。Keith.这当然是一种方法,尽管我依赖于包访问;不要提供构造函数注入点,只需将测试与被测试的bean放在同一个包中即可。这样,您的测试就可以直接访问该值(假设它不是私有的): 您可以使用它来模拟EJB注入系统 另一种方法是在测试中使用反射设置字段,我有时会使用以下方法:
public static void setPrivateField(Class<? extends Object> instanceFieldClass, Object instance, String fieldName, Object fieldValue) throws Exception {
Field setId = instanceFieldClass.getDeclaredField(fieldName);
setId.setAccessible(true);
setId.set(instance, fieldValue);
}
publicstaticvoidsetprivatefield(Class根据,Mockito支持注入模拟资源
public class ATest
{
@InjectMocks
private A a; //this is your class under test into which the mocks will be injected.
@Mock
private B b; //this is the EJB to be injected.
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}
}
您还可以注入多个mock。只需以与B相同的方式声明它们。
initMocks部分也可以在每次测试中完成,也可以在BeforeClass设置方法中完成,具体取决于您的需要。我喜欢这种方式,因为不需要添加额外的代码行。谢谢!您好。如果B是接口,是否可能。请建议我们如何模拟objectI使用一个实现的类创建了一个新对象。对象值为present在测试用例类中运行,但它在实际类中不可用。请您推荐它。我正在寻找类似easy gloss的东西,谢谢!使用反射是有问题的,因为EJB引用实际上是对EJB容器中存根对象的引用(指向EJB),所以您无法检查实际EJB本身。
public class ATest
{
@InjectMocks
private A a; //this is your class under test into which the mocks will be injected.
@Mock
private B b; //this is the EJB to be injected.
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
}
}