giannino1995 ha scritto:
non avevo notato che i test non fossero eseguiti in ordine
Sì in generale è così. Ed è anche ben scritto nella documentazione di JUnit. E normalmente va bene così, perché di norma i test dovrebbero essere isolati, indipendenti. Non dipendenti tra di loro.
giannino1995 ha scritto:
Ho scoperto che esiste però:
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
Sì è una cosa solo da JUnit 4.11 in avanti, tra l'altro. E non andrebbe usata, salvo situazioni davvero particolari/importanti (e non è questo che stiamo discutendo).
giannino1995 ha scritto:
ma cerco di starne il più possibile alla larga. Per me l'IDE non deve occuparsi anche di questo.
Infatti, no. Tra l'altro in contesti aziendali, se non si è sul PC di uno sviluppatore che ha l'IDE aperto, i test spesso/tipicamente vengono lanciati da prompt o da sistemi automatici (es. Jenkins). Insomma
fuori da un IDE. Quindi l'IDE
non deve c'entrare/influire ....
giannino1995 ha scritto:
Ho anche notato che se scrivo:
insert into users(name , email , disabled) values('John' , 'john@gmail.com', false);
insert into users(name , email , disabled) values('Rod' , 'rod@gmail.com' , false);
insert into users(name , email , disabled) values('Becky' , 'becky@gmail.com' , true);
I test con H2 falliscono tutti quanti. Perché accade questo? Spring Boot non crea lo schema della tabella users leggendo l'oggetto User.java? JPA non dovrebbe creare un campo id che si auto incrementa in modo automatico?
Allora facciamo una premessa. Con altri database, ad esempio PostgreSQL, si può creare una cosa del genere:
CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
id INTEGER NOT NULL DEFAULT NEXTVAL('users_id_seq'),
......
......
);
Ossia la sintassi di PostgreSQL permette di creare la colonna id in modo che il default sia, concettualmente: "stacca un numero dalla sequence xyz".
Quindi la colonna SA di dover prendere il nextval dalla sequence se id non viene menzionato/settato esplicitamente.
Ora, se tu avessi guardato attentamente il log del SQL per H2 (che c'è per via del
spring.jpa.show-sql=true), avresti visto:
Hibernate: drop table users if exists
Hibernate: drop sequence if exists hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
Hibernate: create table users (id integer not null, disabled boolean not null, email varchar(255) not null, name varchar(255) not null, primary key (id))
Hibernate: alter table users add constraint UK_6dotkott2kjsp8vw4d0m25fb7 unique (email)
Dove sta scritto
nella definizione di users che la colonna
id dovrebbe staccare il numero da hibernate_sequence?? Infatti ... NON c'è!
Lo "sa" solo Hibernate che prima di una insert deve staccare il numero da hibernate_sequence.
Ma se tu fai una insert "secca" da script SQL così:
insert into users(name , email , disabled) values('John' , 'john@gmail.com', false)
già questa insert fallisce (lo VEDI dal log):
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement:
insert into users(name , email , disabled) values('John' , 'john@gmail.com', false)
E questo fa fallire tutto il setup del contesto di Spring: non crea il EntityManagerFactory, non crea il TransactionManager, ecc... E tutti i test falliscono di brutto.
Ora la tua domanda potrebbe essere: si può specificare su H2 di creare la colonna id per avere come default il next dalla sequence?
Allora: a livello di sintassi può darsi, non lo so per certo, non conosco H2 nei dettagli e bisognerebbe leggere la documentazione (te lo lascio come esercizio ...)
Ma c'è una cosa: l'autore ha fatto l'esempio per H2 e MySQL. E in User è stato molto generico perché ha usato:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
AUTO vuol dire in sostanza: bene ORM (Hibernate), scegli tu la strategia di generazione del ID che risulta meglio per il dialect selezionato. Stando a questo livello generico, non puoi controllare come viene definita la colonna id.
Se vuoi c'è la annotation per specificare la sequence. Ma allora ti funzionerebbe con H2 ma NON con MySQL che non ha le sequence! Una alternativa sarebbe usare il descrittore XML (secondo specifiche JPA) per definire la colonna id, tenendo due xml da attivare uno per volta.
Dovrei andarmi a documentare perché non mi ricordo bene dove/come si fa.
Quindi, per cortesia: NON complicare le cose!!
giannino1995 ha scritto:
Ho anche notato che IntelliJ mi segna questo errore in rosso:
@Table(name="USERS")
Questo problemino però c'è sempre stato, non è una novità. IntelliJ mi scrive:
Cannot resolve table 'USERS'
Non vuol dire nulla di grave. L'annotation è giusta, serve a dire come si deve chiamare la tabella.
@Table si usa sovente perché c'è sempre la differenza di naming tra tabelle e classi. Il nome di tabella dovrebbe essere generalmente al
plurale (perché contiene più righe), es. USER
S, ORDER
S, ecc...
La classe rappresenta 1 entità, quindi va messa al singolare, User, Order.
Se non metti @Table, il ORM usa come nome di tabella esattamente il nome della classe: User .... che non è il massimo. Tutto qui.