与TestNG抗争,Spring和Hibernate。我正在为Service类编写测试,但总是失败。但是不需要测试类就可以正常工作。所以App是可以工作的,但是测试不想这样。
这是我的测试类
@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:
@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:
@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:
@Repository
@Transactional
public abstract class DAO {
@PersistenceContext
protected EntityManager entityManager;
}Maven返回失败:
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)发布于 2016-11-30 18:41:29
我也不得不与之抗争。这里的问题是您的测试在它自己的事务中运行,所以在方法的执行过程中不会提交任何东西。下面是我所做的:
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。
希望这能有所帮助。
发布于 2016-11-30 20:07:32
检查the Spring documentation:看起来你的测试类应该扩展AbstractTestNGSpringContextTests。
发布于 2018-03-22 20:55:26
在整个测试类甚至方法上使用@Commit注释来持久化测试中所做的更改。有关更多信息,请访问https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#commit
https://stackoverflow.com/questions/40885917
复制相似问题