Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在测试中模拟EJB注入_Java_Junit_Ejb_Easymock - Fatal编程技术网

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

}