我正在尝试用一个简单的CRUD创建一个迷你应用程序。 为了这个目标,我使用带有crudrepositories的spring data jpa。 它在执行中效果很好。
但是我想用JUnit测试我的应用程序,而CUD不起作用。 R(读取)部分完全正常,我可以在DB(它是H2 DB)上读取。
没有错误,但是数据库没有更改,然后验证数据修改的断言引发了断言错误。 这是我的代码示例: 实体:
@Entity
@Table(name="personnes")
@NamedQuery(name="Personne.findAll", query="SELECT u FROM Personne u")
public class Personne implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int id;
@Column(nullable=false, length=50)
private String nom;
@Column(nullable=false, length=50)
private String prenom;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getNom() {
return this.nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getPrenom() {
return this.prenom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
}
CRUDRepository:
public interface PersonnesRepository extends CrudRepository<Personne, Integer> {
}
服务:
@Transactional
@Service
public class PersonnesServiceImpl implements PersonnesService{
@Autowired
PersonnesRepository personnesDao;
/**
* {@inheritDoc}
*/
public Optional<List<PersonneDto>> getAll() {
Iterable<Personne> trouve = personnesDao.findAll();
List<PersonneDto> retour = new ArrayList<>();
trouve.forEach(pers -> retour.add(PersonneHelper.personneToPersonneDto(pers)));
return Optional.of(retour);
}
/**
* {@inheritDoc}
*/
public Optional<PersonneDto> getById(int idPersonne) {
return PersonneHelper.personneToPersonneDto(personnesDao.findById(new Integer(idPersonne)));
}
/**
* {@inheritDoc}
*/
public PersonneDto majPersonne(PersonneDto personne) throws TechnicalException {
Optional<Personne> personneOpt = personnesDao.findById(personne.getId());
if(!personneOpt.isPresent())
throw new TechnicalException("Personne non trouvée.");
Personne pers = personneOpt.get();
if(personne.getNom() !=null && !personne.getNom().equals(pers.getNom()))
pers.setNom(personne.getNom());
if(personne.getPrenom() != null && !personne.getPrenom().equals(pers.getPrenom()))
pers.setPrenom(personne.getPrenom());
return PersonneHelper.personneToPersonneDto(personnesDao.save(pers));
}
/**
* {@inheritDoc}
*/
public PersonneDto addPersonne(PersonneDto personne) throws TechnicalException {
Personne pers = new Personne();
pers.setNom(personne.getNom());
pers.setPrenom(personne.getPrenom());
return PersonneHelper.personneToPersonneDto(personnesDao.save(pers));
}
/**
* {@inheritDoc}
*/
public void supprPersonne(PersonneDto personne) throws TechnicalException {
System.out.println(personnesDao.count());
supprPersonne(personne.getId());
System.out.println(personnesDao.count());
}
/**
* {@inheritDoc}
*/
public void supprPersonne(Integer idPersonne) throws TechnicalException {
Optional<Personne> personneOpt = personnesDao.findById(idPersonne);
if(!personneOpt.isPresent())
throw new TechnicalException("Personne non trouvée.");
Personne pers = personneOpt.get();
personnesDao.delete(pers);
}
}
单元测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringDataProjectTest.class)
@ActiveProfiles("test")
@Transactional
public class PersonnesServiceImplTest{
private static final int NOMBRE_ELEMENTS_INITIAL_LISTE = 8;
private static final int PERSONNE_ID_OK = 1;
private static final int PERSONNE_ID_KO = 210;
private static final String NOM_TEST_MAJ = "nomTest";
private static final String NOM_TEST_ADD = "nomTestAdd";
private static final String PRENOM_TEST_ADD = "prenomTestAdd";
private static final String LA_LISTE_DOIT_ETRE_PRESENTE = "La liste doit être présente.";
private static final String LA_LISTE_DOIT_PAS_ETRE_NULLE = "La liste ne doit pas être nulle.";
private static final String LA_LISTE_DOIT_PAS_ETRE_VIDE = "La liste ne doit pas être vide.";
private static final String ON_DEVRAIT_AVOIR_TROUVE_LA_PERSONNE = "On devrait avoir trouvé la personne.";
private static final String LA_LISTE_DOIT_CONTENIR_X_ELEMENTS = "La liste doit contenir \"%d\" éléments.";
EntityManager em;
@Autowired
PersonnesService personneService;
@Autowired
PersonnesRepository personnesDao;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Test
public void supprPersonneByObjOK() throws TechnicalException {
Optional<PersonneDto> personneOpt = personneService.getById(PERSONNE_ID_OK);
if(!personneOpt.isPresent())
throw new TechnicalException(ON_DEVRAIT_AVOIR_TROUVE_LA_PERSONNE);
PersonneDto personne = personneOpt.get();
personneService.supprPersonne(personne);
Optional<List<PersonneDto>> listePersonneOpt = personneService.getAll();
assertTrue(LA_LISTE_DOIT_ETRE_PRESENTE, listePersonneOpt.isPresent());
assertNotNull(LA_LISTE_DOIT_PAS_ETRE_NULLE, listePersonneOpt.get());
assertFalse(LA_LISTE_DOIT_PAS_ETRE_VIDE, listePersonneOpt.get().isEmpty());
assertEquals(String.format(LA_LISTE_DOIT_CONTENIR_X_ELEMENTS, NOMBRE_ELEMENTS_INITIAL_LISTE-1), NOMBRE_ELEMENTS_INITIAL_LISTE-1, listePersonneOpt.get().size());
}
}
这是堆栈跟踪,显示测试失败
java.lang.AssertionError: La liste doit contenir "7" éléments. expected:<7> but was:<8>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:645)
at fr.toulemont.springdatatest.service.impl.PersonnesServiceImplTest.test(PersonnesServiceImplTest.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
我再说一遍,它在正常执行期间可以完美地工作,但是在测试中却不能。 对于最简单的测试,我的微型项目gitlab:https://gitlab.com/lordashram/springdatatestproject
我看到了所有%*#的任何解决方案,我不想在没有可以测试所有内容的单元测试的情况下继续我的应用程序。 感谢您的帮助。