...
Ik heb dit leerdoel niet gehaald in de eerste paar sprints sprint. Ik viel nog te vaak in discussies. Het is niet gek dat ik dit toen nog niet heb gehaald, aangezien het de eerste paar sprints waren en vooruitgang in kleine stapjes gaat. In het IPV rapport van sprint 1 is te zien dat ik dit nog niet heb gehaald door te kijken naar de feedback. Voor de laatste paar sprints moet ik dus een scherper beeld hebben op dit leerdoel en moest ik ervoor zorgen dat ik dit doel niet uit het oog verlies.
Helaas kwam er een discussie (zie bijlage discussie login review) nadat mijn groepsleden mij feedback hadden gegeven. Dit wil ik graag verbeteren, door te zorgen dat ik bij frustraties een paar tellen wacht, voordat ik reageer op een antwoord. Ook zal ik proberen mijn frustratie wat meer weg te lachen. Hiermee bedoel ik dat ik mijn frustratie wat minder serieus moet nemen en moet kijken naar wat ik fout doe om deze frustratie te krijgen. Vooral wil ik hiermee zorgen dat ik niet meer boos wordt om deze voorgevallen.
...
In sprint 2 was er een discussie begonnen over hoe de loginfunctie veranderd moest worden. Dit gebeurde na het reviewen van mijn taak. Wijnand en Bram waren mijn stukje code aan het reviewen en zagen dat er een aantal aanpassingen gedaan konden worden. In dit geval ontving ik dus feedback en gaven Bram en Wijnand hun feedback. Ik had verwacht dat ik mijn code nog wel wat had moeten aanpassen, want ik zal best een paar dingen over het hoofd hebben gezien. Ik kreeg mijn feedback terug en besloot de aanpassingen die zij hadden toegelicht te implementeren, zodat ik klaar zou zijn met het maken van de login. Mijn frustratie over het maken van deze loginfunctie lag hoog, want ik zat al boven de geschatte tijd in en wilde graag bezig zijn met andere competenties. Na het verbeteren had ik aangegeven dat mijn stukje code verbeterd was en weer klaar was om gereviewed te worden. Dit keer verliep het alleen anders. Veel van wat ik net moest veranderen aan mijn code, moest weer op een andere manier gedaan worden dan bij de vorige review was aangegeven. Dit ging vooral over het geven van tokens en het hashen van een wachtwoord. Ik was hier boos om geworden, omdat ik weer tijd had besteed aan een stukje code, om vervolgens te horen dat het weer anders moest. Aangezien ik deze sprint al vaker problemen had gehad met de loginfunctie, besloot ik dat ik wilde stoppen met het maken van deze code, aangezien ik er niet meer onderuit kwam. Dit deed ik alleen op een best wel boze manier en dit had ik anders kunnen aanpakken. Als ik mijn frustratie had uitgelegd en gevraag om een oplossing, dan was dat een betere optie geweest, dan het werk verschuiven naar iemand anders. Ik dacht dat door mijn werk naar iemand anders te verschuiven, er een teamlid zou zijn die er meer van wist en het dus sneller af zou maken. De groep had aangegeven in het IPV dat dit wel anders gehandeld had kunnen worden, waarbij ik het ook mee-eens ben. Ik had niet boos moeten worden en naar oplossingen moeten zoeken.
Voorbeelen van unittests
GraphDAO test
Code Block |
---|
title | GraphDAO |
---|
linenumbers | true |
---|
collapse | true |
---|
|
package nl.aim.regterschotracing.datasource.dao;
import nl.aim.regterschotracing.datasource.databaseutil.DatabaseConnection;
import nl.aim.regterschotracing.domain.exceptions.DatabaseException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import java.sql.ResultSet;
import java.sql.SQLException;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;
class GraphDAOTest {
Integer tabID = 1;
Integer graphID = 1;
String graphType = "LineChart";
@InjectMocks
GraphDAO sut;
@Mock
DatabaseConnection mockDatabaseConnection;
ResultSet mockedResultSet;
@BeforeEach
void setup() {
sut = new GraphDAO();
mockDatabaseConnection = mock(DatabaseConnection.class);
mockedResultSet = mock(ResultSet.class);
sut.setDatabaseConnection(mockDatabaseConnection);
}
@Test
void getGraphs() throws SQLException {
when(mockDatabaseConnection.selectQuery(anyString(), any())).thenReturn(mockedResultSet);
when(mockedResultSet.next()).thenReturn(true).thenReturn(false);
assertNotNull(sut.getGraphs(tabID));
verify(mockDatabaseConnection).selectQuery(anyString(), any());
}
@Test
void getUserTabsSqlException() throws SQLException {
when(mockDatabaseConnection.selectQuery(anyString(), any())).thenThrow(SQLException.class);
assertThrows(DatabaseException.class, () -> {
sut.getGraphs(tabID);
});
verify(mockDatabaseConnection).selectQuery(anyString(), any());
}
@Test
void addGraphsTestSqlException() throws SQLException {
when(mockDatabaseConnection.selectQuery(anyString(), any())).thenReturn(mockedResultSet);
doThrow(SQLException.class).when(mockDatabaseConnection).executeUpdate(anyString(), any());
when(mockedResultSet.next()).thenReturn(true).thenReturn(false);
assertThrows(DatabaseException.class, () -> {
sut.addGraph(1, 1, "linechart");
});
verify(mockDatabaseConnection).executeUpdate(anyString(), any());
}
@Test
void deleteGraphsTest() throws DatabaseException, SQLException {
doThrow(new SQLException()).when(mockDatabaseConnection).executeUpdate(anyString(), any());
assertThrows(DatabaseException.class, () -> {
sut.deleteGraph(1, 1);
});
verify(mockDatabaseConnection).executeUpdate(anyString(), any());
}
@Test
void addGraph() throws SQLException {
when(mockDatabaseConnection.selectQuery(anyString(), any())).thenReturn(mockedResultSet);
when(mockedResultSet.next()).thenReturn(true).thenReturn(false);
sut = mock(GraphDAO.class);
sut.addGraph(tabID, graphID, graphType);
verify(sut).addGraph(tabID, graphID, graphType);
}
@Test
void deleteGraph() throws SQLException {
when(mockDatabaseConnection.selectQuery(anyString(), any())).thenReturn(mockedResultSet);
when(mockedResultSet.next()).thenReturn(true).thenReturn(false);
sut = mock(GraphDAO.class);
sut.deleteGraph(tabID, graphID);
verify(sut).deleteGraph(tabID, graphID);
}
} |
GraphService test
Code Block |
---|
title | GraphService |
---|
linenumbers | true |
---|
collapse | true |
---|
|
package nl.aim.regterschotracing.domain.services;
import nl.aim.regterschotracing.datasource.dao.GraphDAO;
import nl.aim.regterschotracing.domain.exceptions.DatabaseException;
import nl.aim.regterschotracing.presentation.dto.GraphsDTO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;
public class GraphServiceTest {
@Mock
public GraphService sut;
@InjectMocks
public GraphDAO graphDAO;
@Mock
public GraphsDTO graphDTO;
@BeforeEach
public void setup() {
sut = new GraphService();
graphDAO = Mockito.mock(GraphDAO.class);
sut.setGraphDAO(graphDAO);
graphDTO = new GraphsDTO();
graphDTO.setName("test");
graphDTO.setTabId(1);
graphDTO.setId(1);
}
@Test
void getAllGraphsTest() {
//Arrange
List<GraphsDTO> mockedData = new ArrayList<>();
mockedData.add(graphDTO);
//Act
Mockito.when(graphDAO.getGraphs(1)).thenReturn(mockedData);
//Assert
assertEquals(sut.getAll(1).get(0), graphDTO);
}
@Test
void addGraph() throws DatabaseException {
doThrow(DatabaseException.class).when(graphDAO).addGraph(anyInt(), anyInt(), anyString());
assertThrows(DatabaseException.class, () -> {
sut.addGraph(1, 1, "linechart");
});
verify(graphDAO).addGraph(1, 1, "linechart");
}
@Test
void deleteGraphs() throws DatabaseException {
doThrow(DatabaseException.class).when(graphDAO).deleteGraph(anyInt(), anyInt());
assertThrows(DatabaseException.class, () -> {
sut.deleteGraph(1, 1);
});
verify(graphDAO).deleteGraph(1, 1);
}
}
|
GraphResource test
Code Block |
---|
title | GraphResource |
---|
linenumbers | true |
---|
collapse | true |
---|
|
package nl.aim.regterschotracing.presentation.resources;
import nl.aim.regterschotracing.domain.services.GraphService;
import nl.aim.regterschotracing.presentation.dto.GraphsDTO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
public class GraphResourceTest {
@Mock
private GraphResource sut;
@InjectMocks
GraphService graphService;
String token;
List<GraphsDTO> graphsDTOList;
final int http_statuscode_ok = 200;
@BeforeEach
public void setup() {
sut = new GraphResource();
graphService = mock(GraphService.class);
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjo0MiwidXNlcm5hbWUiOiJFcmlrIn0.FA26z63uwWWOfOM8EHfdBiYw6DzcfAF6EJ4YzZiQ-q0";
sut.setGraphService(graphService);
GraphsDTO graphsDTO1 = new GraphsDTO();
GraphsDTO graphsDTO2 = new GraphsDTO();
graphsDTO1.setName("test");
graphsDTO1.setId(1);
graphsDTO1.setTabId(1);
graphsDTO2.setName("test");
graphsDTO2.setId(2);
graphsDTO2.setTabId(1);
graphsDTOList = new ArrayList<>();
graphsDTOList.add(graphsDTO1);
graphsDTOList.add(graphsDTO2);
}
@Test
void addGraphTest() {
int testValue = sut.addGraph(1,1,"line").getStatus();
assertEquals(http_statuscode_ok, testValue);
}
@Test
void deleteGraphTest(){
int testValue = sut.deleteGraph(1,1).getStatus();
assertEquals(http_statuscode_ok, testValue);
}
} |