[英]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.