gpt4 book ai didi

java - 如何使用 @Autowired 字段测试通用抽象类?

转载 作者:行者123 更新时间:2023-11-30 05:32:47 31 4
gpt4 key购买 nike

我有通用抽象类 AbstractBaseEntityGenericDao,其中包含 @Autowired 字段。它工作得很好,直到我不得不为它编写一个单元测试,以免在扩展它的类的所有测试中重复相同的代码。现在我在想...是否可以为此类编写单元/集成测试?

@Repository
@Transactional
public abstract class AbstractBaseEntityGenericDao<T extends BaseEntity> {

private Class<T> classInstance;

private SessionFactory sessionFactory;

@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public final void setClassInstance(Class<T> clasInstance) {
this.classInstance = clasInstance;
}

public void create(@NonNull T entity) {
Session session = sessionFactory.getCurrentSession();
session.save(entity);
}

public Optional<T> find(long id) {
Session session = sessionFactory.getCurrentSession();
return Optional.ofNullable(session.get(classInstance, id));
}

public void update(@NonNull T entity) {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(entity);
}

public void remove(@NonNull Long id) throws EntityNotFoundException {
Session session = sessionFactory.getCurrentSession();
session.remove(session.load(classInstance, id));
}

public void remove(@NonNull T entity) {
Session session = sessionFactory.getCurrentSession();
session.remove(entity);
}
}

最佳答案

这很困难的原因是因为通常您不应该这样做。抽象类不应该知道它的子类如何创建SessionFactory。所以它应该看起来像:

@Repository
@Transactional
public abstract class AbstractBaseEntityGenericDao<T extends BaseEntity> {

...

protected SessionFactory sessionFactory;

...
}

现在您不能直接对抽象类进行单元测试,因为它无法实例化。但是,您可以在单元测试中将其 stub ,然后测试该 stub 。 stub 反过来将有一个 protected 字段的构造函数,我们可以在单元测试中模拟它。最后它看起来像:

public class AbstractBaseEntityGenericDaoTest {

private class AbstractClassStub extends AbstractBaseEntityGenericDao {

public AbstractClassStub(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
public void create(BaseEntity entity) {
super.create(entity);
}

@Override
public Optional find(long id) {
return super.find(id);
}

@Override
public void update(BaseEntity entity) {
super.update(entity);
}

@Override
public void remove(@NonNull Long id) throws EntityNotFoundException {
super.remove(id);
}

@Override
public void remove(BaseEntity entity) {
super.remove(entity);
}
}

@Mock
SessionFactory sessionFactory;

private AbstractClassStub abstractClassStub;

@Before
public void before() {
sessionFactory = mock(SessionFactory.class);
abstractClassStub = new AbstractClassStub(sessionFactory);
}

@Test
public void testWhatever() {
abstractClassStub.find(1); //or whatever
}
}

关于java - 如何使用 @Autowired 字段测试通用抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204141/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com