błąd testów Spring JDBC

0

Witam ,
ostatnio pisząc proste testy do bazy napotkałem błąd :

java.lang.AssertionError: 
Expected: (a collection containing <Customer(customerNumer=105, customerName=Atelier graphique, contactLastName=Schmitt, contactFirstName=Carine, phone=40.32.2555, addressLine1=54, addressLine2=rue Royale, city=, state=Nantes, postalCode=44000, country=France, salesRepEmployeeNumber=1370, creditLimit=21000.0)>)
     but: a collection containing <Customer(customerNumer=105, customerName=Atelier graphique, contactLastName=Schmitt, contactFirstName=Carine, phone=40.32.2555, addressLine1=54, addressLine2=rue Royale, city=, state=Nantes, postalCode=44000, country=France, salesRepEmployeeNumber=1370, creditLimit=21000.0)> 
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at pl.spring.jdbc.Dao.CustomerDaoTest.findByCity(CustomerDaoTest.java:62)
	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.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	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.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	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.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
	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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
	

sprawdzałem składnię oraz wartości bazy i wszystko się zgadza, ale dalej wywala błąd testu
link do kodu (test findByCity):
https://github.com/tzydo/Spring-Jdbc-/blob/master/src/test/java/pl/spring/jdbc/Dao/CustomerDaoTest.java

0

Błąd asercji hashcody i equals pokryte w Customer? ewentualnie lombokowe odpowiedniki

0

tak , dodałem adnotacje @data z lombok która odpowiada za generowanie tego typu metod

1

Rzuca się w oczy creditLimit, który jest doublem, czyli naiwnie zrobiony equals nie musi działać. W ogóle co to za pomysł - double do pieniędzy?

0

pracuje na gotowej bazie (nie mojej) i wydawało mi się najlepszym wyjściem dać jako double.Chyba że możesz mi zaproponować lepsze rozwiązanie?

2

Trzymanie kwot pieniężnych w double to w zasadzie zbrodnia/masakra/(gorsze niż gluten). Generalnie w Javie tylko BigDecimal (Joda Money miało być lepsze, ale jakoś nie widzę, żeby się przyjęło).
http://www.mberkan.pl/2014/08/03/operacje-na-kwotach-w-javie/
A double ogólnie nie jest dobrym formatem jeśli chcesz używac equals (to problem nr 2. - pomniejszy).
(Bazy danych najczęściej nie trzymają wartości numerycznych w double czy float - (zobacz sobie definicję tej kolumny))

0

fakt zmienne w bazie miałem oznaczone jako decimal , dzięki za radę już poprawiam :)

0

Tylko że po zmianie parametru na Big decimal wywaliło kolejny błąd :
Error:(66, 21) java: incompatible types: double cannot be converted to java.math.BigDecimal

1

A może to jednak błąd kompilatora
bo powinieneś napisać tak:
1370,new BigDecimal("21000.00")))); //homcrest test

0

poprawiłem na new BigDecimal , zmienną też, dodałem konstruktor bezparametrowy do klasy Customer i wróciłem do pierwszego błędu .

Expected: (a collection containing <Customer(customerNumer=105, customerName=Atelier graphique, contactLastName=Schmitt, contactFirstName=Carine, phone=40.32.2555, addressLine1=54, addressLine2=rue Royale, city=, state=Nantes, postalCode=44000, country=France, salesRepEmployeeNumber=1370, creditLimit=21000)>)
     but: a collection containing <Customer(customerNumer=105, customerName=Atelier graphique, contactLastName=Schmitt, contactFirstName=Carine, phone=40.32.2555, addressLine1=54, addressLine2=rue Royale, city=, state=Nantes, postalCode=44000, country=France, salesRepEmployeeNumber=1370, creditLimit=21000)> 

	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
	at pl.spring.jdbc.Dao.CustomerDaoTest.findByCity(CustomerDaoTest.java:63)
	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.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	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.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
	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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)```
1

Dobra widze. Do bazy danych dla rekordu 105 wrzucasz City = NULL - a sprawdzasz czy "". (Tak dla Oracle to to samo - ale Ty akurat nie masz chyba tak głupiej bazy :-) ) .

0

poprawiłem już nazewnictwo metod na właściwe

0

Rozwiązanie nie było takie trudne teraz jak sobie tak myślę :D , poza drobnymi literówkami w kodzie musiałem przekazać wartość w parametrze new BigDecimal(21000.00).setScale(2) i dodać skalę bo bez tego wyrzucało błąd nie zgodności danych

1 użytkowników online, w tym zalogowanych: 0, gości: 1