首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring + Hibernate + TestNG + Mocking nothing持久化,测试中读取nothing

Spring + Hibernate + TestNG + Mocking nothing持久化,测试中读取nothing
EN

Stack Overflow用户
提问于 2016-11-30 18:27:06
回答 3查看 166关注 0票数 1

与TestNG抗争,Spring和Hibernate。我正在为Service类编写测试,但总是失败。但是不需要测试类就可以正常工作。所以App是可以工作的,但是测试不想这样。

这是我的测试类

代码语言:javascript
复制
@Transactional
public class BorrowerServiceTest {

@Mock
BorrowerDAOImpl borrowerDAO;

@InjectMocks
BorrowerService borrowerService;

@BeforeClass
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void persistTest() {
    Borrower borrower = new Borrower.BorrowerBuilder().firstName("Lars").lastName("Urlich").adress("LA")
            .phoneNumber("900900990").build();
    borrowerService.persist(borrower);
    List<Borrower> borrowerList = borrowerService.getBorrowerByName("Lars Urlich");
    Assert.assertEquals(true, borrower.equals(borrowerList.get(0)));
}

}

我的BorrowerService:

代码语言:javascript
复制
@Service("borrowerService")
@Transactional
public class BorrowerService {

@Autowired
private BorrowerDAO borrowerDAO;

public List<Borrower> getBorrowers() {
    return borrowerDAO.getBorrowers();
}

public List<Borrower> getBorrowerByName(String name) {
    return borrowerDAO.getBorrowerByName(name);
}

public boolean removeBorrower(Borrower borrower) {
    return borrowerDAO.removeBorrower(borrower);
}

public boolean persist(Borrower borrower) {
    return borrowerDAO.persist(borrower);
}
}

我的BorrowerDAOImpl:

代码语言:javascript
复制
@Repository("borrowerDAO")
@Transactional
public class BorrowerDAOImpl extends DAO implements BorrowerDAO {

@Override
public List<Borrower> getBorrowers() {
    List<Borrower> borrowerList = null;
    Query query = entityManager.createQuery("SELECT B FROM Borrower B");
    borrowerList = query.getResultList();
    return borrowerList;
}

@Override
public List<Borrower> getBorrowerByName(String name) {
    List<Borrower> borrowerList = null;
    String[] values = name.split(" ");
    Query query = entityManager.createQuery("SELECT B FROM Borrower B WHERE B.firstName LIKE '" + values[0]
            + "' AND B.lastName LIKE '" + values[1] + "'");
    borrowerList = query.getResultList();
    return borrowerList;
}

@Override
public boolean removeBorrower(Borrower borrower) {
    String firstName = borrower.getFirstName();
    String lastName = borrower.getLastName();
    Query query = entityManager
            .createQuery("DELETE Borrower where FIRST_NAME LIKE :FirstName AND LAST_NAME LIKE :LastName");
    query.setParameter("FirstName", firstName);
    query.setParameter("LastName", lastName);
    query.executeUpdate();
    return true;
}

@Override
public boolean persist(Borrower borrower) {
    entityManager.persist(borrower);
    return true;
}

}

和抽象DAO:

代码语言:javascript
复制
@Repository
@Transactional
public abstract class DAO {

    @PersistenceContext
    protected EntityManager entityManager;  
}

Maven返回失败:

代码语言:javascript
复制
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.LinkedList.checkElementIndex(LinkedList.java:555)
    at java.util.LinkedList.get(LinkedList.java:476)
    at com.me.service.test.BorrowerServiceTest.persistTest(BorrowerServiceTest.java:41)
EN

回答 3

Stack Overflow用户

发布于 2016-11-30 18:41:29

我也不得不与之抗争。这里的问题是您的测试在它自己的事务中运行,所以在方法的执行过程中不会提交任何东西。下面是我所做的:

代码语言:javascript
复制
public class IntegrationTest extends SomeTestBase
{
    @Autowired
    private PlatformTransactionManager  platformTransactionManager;

    private TransactionTemplate         transactionTemplate;

    @Autowired
    private BeanToTest beanToTest;

    @Override
    @Before
    public void setup()
    {
        super.setup();
        this.transactionTemplate = new TransactionTemplate(this.platformTransactionManager);
    }

    @Test
    public void fooTest()
    {
        // given

        // when
        boolean result = this.transactionTemplate.execute(new TransactionCallback<Boolean>()
        {
            @Override
            public Boolean doInTransaction(TransactionStatus status)
            {
                return IntegrationTest.this.beanToTest.foo();
            }
        });

        // then
    }
}

这允许您在单独的事务中执行方法。请注意,您可能会将一些变量声明为final

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2016-11-30 20:07:32

检查the Spring documentation:看起来你的测试类应该扩展AbstractTestNGSpringContextTests

票数 0
EN

Stack Overflow用户

发布于 2018-03-22 20:55:26

在整个测试类甚至方法上使用@Commit注释来持久化测试中所做的更改。有关更多信息,请访问https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#commit

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40885917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档