在一個Jave EE應用程式中,我想為記憶體資料庫集成測驗創建一個基礎測驗,以初始化EntityManagerFactory和EntityManager。另外,要測驗的服務Bean還沒有確定,所以我把它做成通用的。
我有:
package xxxxx;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import java.lang.invoke.MethodHandles。
import java.lang.reflect.Field。
import javax.persistence.EntityManager。
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence。
import static org.mockito.Mockito.mockingDetails;
import static org.mockito.Mockito.spy;
/**。
* T:要測驗的服務豆類
*/
public abstract class H2DBIntTestBase< T> {
protected EntityManager realEntityManager;
protected static EntityManagerFactory factory;
protected T serviceBean;
public abstract void setServiceBean();
public abstract String getPUName();
@Before
public void setup() {
//由于我們不能在超類的@BeforeClass中靜態地獲得類名,我們必須做
//它是這樣的。我們不關心重復創建,因為它們是同一個,所以我們不 //這樣做。
///用同步/雙重檢查來保護它。。
if (factory == null) {
factory = Persistence.createEntityManagerFactory(getPUName())。
}
realEntityManager = factory.createEntityManager()。
EntityManager spy = spy(realEntityManager)。
setServiceBean()。
try {
//注入真正的物體管理器,而不是使用mocks。
Field entityManagerField = serviceBean.getClass().getDeclaredField("entityManager")。
entityManagerField.setAccessible(true)。
entityManagerField.set(serviceBean, spy)。
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new AssertionError("should not reach here"/span>)。
}
}
@After; }
public void teardown() {
realEntityManager.close()。
}
而且,在我的具體int測驗中:
@RunWith(MockitoJUnitRunner.class)
public class MyServiceBeanIntTest extends H2DBIntTestBase< MyServiceBean> {
private Query<String> inputQuery。
@Override
public void setServiceBean() {
super.serviceBean = new SubscriptionHistoryPersistenceServiceBean()。
}
@Override
public String getPUName() {
return serviceBean.getClass().getName()。
}
@Before
public void setup {
inputQuery = new Query<>()。
... //其他存根。
}
@Test
public void test1() {
try {
//當
List<SubscriptionHistory> actual = serviceBean.doSth(inputQuery, Enum.TypeA)。
//<----------- 這里serviceBean總是空的,為什么?
// then
//span>斷言
} catch (DataLookupException e) {
throw new AssertionError("should not reach here") 。
}
}
但是,我在測驗中總是出現NPE,一開始是在@After,然后是在我的@Test。
為什么我的serviceBean沒有被初始化?超級測驗的@BeforeClass和@Before不是應該在BEFORE子類運行嗎?
Mockito。org.mockito:mockito-core:1.10.19。
JUnit。junit:junit:4.11
我沒有使用Spring/Spring Boot。
uj5u.com熱心網友回復:
為什么我的serviceBean沒有被初始化?
為什么我的serviceBean沒有被初始化?
因為你在子類中覆寫了setup()。
要么給子類(或超類)的setup()一個不同的名字,要么從子類中呼叫超類的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318413.html
標籤:
上一篇:具有泛型的可歸零參考的注解
下一篇:如何為多個n多次運行R代碼
