簡體   English   中英

在測試中模擬EJB注入

[英]Mocking EJB injection in tests

每當我想測試一個使用資源注入的類時,我最終會包含一個只在測試中使用的構造函數:

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

}

是否存在另一種模擬資源注入的方法,或者這是正確的模式?

你可以使用簡單的光澤效果,它嘲笑EJB注入系統。

另一種方法是在測試中使用reflexion設置字段,我有時會使用這樣的東西:

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

根據這篇文章(Mockito和Dependency Injection) ,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);
    }

}

你也可以注入多個嘲笑。 只需用與B b相同的方式聲明它們。 initMocks部分也可以在每個測試中或在BeforeClass設置方法中完成,具體取決於您的需要。

Eliocs,

如果鍵入B接口,那么你就不會“只是”為測試用例做這樣的事情; 你會允許“B的行為”的任何替代實現,即使它/它們的需要尚未被設想。

是的,基本上這是唯一可以遵循的模式(AFAIK)......所以(正確或錯誤地)你也可以充分利用它;-)

干杯。 基思。

這當然是一種方法,雖然我依賴於包訪問; 不提供構造函數注入點,而只是將測試放在與被測試的bean相同的包中。 這樣,您的測試可以直接訪問該值(假設它不是私有的):

@Test
public void EJBInjectionTest() {
   A a=new A();
   a.b=new B() {
       // mock functionality here, of course...
   };
   assertNotNull(a.b);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM