Skip to content

Commit

Permalink
Optimised, refactored and improved tests and achieved 100% class and …
Browse files Browse the repository at this point in the history
…method test coverage; Added jupiter test suite for controller test execution order; Updated junit-jupiter version to 5.11.0
  • Loading branch information
MarkoDojkic committed Sep 7, 2024
1 parent 1bad055 commit 803b654
Show file tree
Hide file tree
Showing 14 changed files with 505 additions and 248 deletions.
20 changes: 19 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
<spring-version>3.3.2</spring-version>
<spring-integration-version>6.3.2</spring-integration-version>
<jmockit-version>1.49.2</jmockit-version>
<junit-jupiter-version>5.10.2</junit-jupiter-version>
<junit-jupiter-version>5.11.0</junit-jupiter-version>
<application.version>${project.version}</application.version>
</properties>

Expand Down Expand Up @@ -167,6 +167,18 @@
<version>${junit-jupiter-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite-api</artifactId>
<version>1.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
Expand Down Expand Up @@ -249,6 +261,11 @@
<goals>
<goal>report</goal>
</goals>
<configuration>
<excludes>
<exclude>dev/markodojkic/softwaredevelopmentsimulation/SoftwareDevelopmentSimulationApp.class</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
Expand All @@ -259,6 +276,7 @@
<configuration>
<argLine>
${argLine} <!-- Needed for jacoco to run -->
-Dspring.profiles.active=test
-Xshare:off
-XX:+EnableDynamicAgentLoading
-javaagent:${user.home}/.m2/repository/com/github/hazendaz/jmockit/jmockit/${jmockit-version}/jmockit-${jmockit-version}.jar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,7 @@ public static void main(String[] args) {
} catch (IOException e) {
getIGateways().sendToInfo(String.format("Welcome to Software development simulator™ Developed by Ⓒ Marko Dojkić 2024%nSize occupied by predefined data is: %.2f KB%nI hope you will enjoy using my spring integration web-based application", 0.00));
}

//TODO: Implement swagger, explain controllers and write readme
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@
import dev.markodojkic.softwaredevelopmentsimulation.enums.DeveloperType;
import dev.markodojkic.softwaredevelopmentsimulation.model.BaseTask;
import dev.markodojkic.softwaredevelopmentsimulation.model.Developer;
import org.junit.jupiter.api.BeforeAll;
import dev.markodojkic.softwaredevelopmentsimulation.test.Config.GlobalSetupExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.ZonedDateTime;

import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.setupDataProvider;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@SpringBootTest
@ExtendWith(GlobalSetupExtension.class)
class BaseTaskTest {
@BeforeAll
public static void preSetup(){
setupDataProvider(true);
}

@Test
void when_noArgsConstructorIsCalled_correctValuesAreSetAsDefault() {
BaseTask task = new BaseTask();
Expand All @@ -34,10 +32,11 @@ void when_noArgsConstructorIsCalled_correctValuesAreSetAsDefault() {
}

@Test
void when_allArgsConstructorIsCalled_correctValuesAreSet() {
void when_allArgsConstructorIsCalled_correctValuesAreSetAndToStringIsAdequate() {
Priority priority = Priority.NORMAL;
Developer assignee = mock(Developer.class);
Developer reporter = mock(Developer.class);
Developer reporter = new Developer("John Doe", "1234567858123", DeveloperType.SENIOR_DEVELOPER, false, 2L);
Developer assignee = new Developer("Alice Johnson", "9876543210987", DeveloperType.INTERN_DEVELOPER, true, 1L);

ZonedDateTime createdOn = ZonedDateTime.now();

BaseTask task = new BaseTask("1", "Task Name", "Task Description", priority, assignee, reporter, createdOn);
Expand All @@ -49,6 +48,19 @@ void when_allArgsConstructorIsCalled_correctValuesAreSet() {
assertEquals(assignee, task.getAssignee());
assertEquals(reporter, task.getReporter());
assertEquals(createdOn, task.getCreatedOn());

// Assertion for toString method
String expectedToString = "BaseTask{" +
"id='1'," +
" name='Task Name'," +
" description='Task Description'," +
" priority=NORMAL," +
" assignee='" + assignee.getDisplayName() +
"', reporter='" + reporter.getDisplayName() +
"', createdOn=" + createdOn +
'}';

assertEquals(expectedToString, task.toString());
}

@Test
Expand Down Expand Up @@ -104,34 +116,6 @@ void when_equalsOrHashCodeIsCalled_onEqualObjectAreSame_onNonEqualObjectsAreDiff
// Test with null
assertNotNull(task1);
}

@Test
void testToString() {
Priority priority = Priority.NORMAL;
Developer assignee = mock(Developer.class);
Developer reporter = mock(Developer.class);
ZonedDateTime createdOn = ZonedDateTime.now();

BaseTask task = new BaseTask("1", "Task Name", "Task Description", priority, null, null, createdOn);

String expectedToString = "BaseTask{id='1', name='Task Name', description='Task Description', priority=" + priority +
", assignee='UNASSIGNED', reporter='UNASSIGNED', createdOn=" + createdOn + '}';

assertEquals(expectedToString, task.toString());

task.setAssignee(assignee);
task.setReporter(reporter);

expectedToString = "BaseTask{id='1', name='Task Name', description='Task Description', priority=" + priority +
", assignee='" + assignee.getDisplayName() + "', reporter='" + reporter.getDisplayName() +
"', createdOn=" + createdOn + '}';

assertEquals(expectedToString, task.toString());

task.setReporter(null);

assertEquals(expectedToString, task.toString());
}

@Test
void when_gettersAndSettersAreCalled_valuesAreCorrectlyRetrievedOrSet() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.markodojkic.softwaredevelopmentsimulation.test.Config;

import dev.markodojkic.softwaredevelopmentsimulation.util.Utilities;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.setupDataProvider;

public class GlobalSetupExtension implements BeforeAllCallback, AfterAllCallback {
@Override
public void beforeAll(ExtensionContext extensionContext) {
setupDataProvider();
}

@Override
public void afterAll(ExtensionContext context) throws Exception {
FileUtils.deleteDirectory(Utilities.getCurrentApplicationDataPath().toAbsolutePath().toFile());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package dev.markodojkic.softwaredevelopmentsimulation.test.Config;

import com.fasterxml.jackson.databind.ObjectMapper;
import dev.markodojkic.softwaredevelopmentsimulation.DeveloperImpl;
import dev.markodojkic.softwaredevelopmentsimulation.ProjectManagerImpl;
import dev.markodojkic.softwaredevelopmentsimulation.config.MiscellaneousConfig;
import dev.markodojkic.softwaredevelopmentsimulation.config.SpringIntegrationMessageChannelsConfig;
import dev.markodojkic.softwaredevelopmentsimulation.flow.FileHandlingFlow;
import dev.markodojkic.softwaredevelopmentsimulation.flow.MQTTFlow;
import dev.markodojkic.softwaredevelopmentsimulation.flow.PrintoutFlow;
import dev.markodojkic.softwaredevelopmentsimulation.interfaces.IGateways;
import dev.markodojkic.softwaredevelopmentsimulation.model.DevelopmentTeamCreationParameters;
import dev.markodojkic.softwaredevelopmentsimulation.transformer.PrinterTransformer;
import dev.markodojkic.softwaredevelopmentsimulation.util.Utilities;
import dev.markodojkic.softwaredevelopmentsimulation.web.DevelopersPageController;
import dev.markodojkic.softwaredevelopmentsimulation.web.MainController;
import io.moquette.broker.Server;
import io.moquette.broker.config.MemoryConfig;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;

import java.io.IOException;
import java.nio.file.Files;
import java.util.Properties;

import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.setupDataProvider;
import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.updateDevelopmentTeamsSetup;
import static org.junit.jupiter.api.Assertions.assertNotNull;

@SpringBootTest
@AutoConfigureMockMvc // Enables MockMvc with full context
//@ComponentScan(basePackages = "dev.markodojkic.softwaredevelopmentsimulation")
@ContextConfiguration(classes = { MiscellaneousConfig.class, TestConfig.class, SpringIntegrationMessageChannelsConfig.class, MQTTFlow.class, PrintoutFlow.class, FileHandlingFlow.class, PrinterTransformer.class, DeveloperImpl.class, ProjectManagerImpl.class, MainController.class, DevelopersPageController.class })
@ExtendWith(MockitoExtension.class)
@ExtendWith(GlobalSetupExtension.class)
public abstract class SoftwareDevelopmentSimulationAppBaseTest {
private static Server mqttServer;

@Autowired
@Qualifier("IGateways")
private IGateways iGateways;

@Autowired
private ObjectMapper objectMapper;

@BeforeAll
public static void preSetup() throws Exception {
Properties properties = new Properties();
properties.setProperty("port", "21681");
properties.setProperty("host", "0.0.0.0");
properties.setProperty("password_file", ""); //No password
properties.setProperty("allow_anonymous", "true");
properties.setProperty("netty.mqtt.message_size", "102400");

MemoryConfig memoryConfig = new MemoryConfig(properties);
mqttServer = new Server();
mqttServer.startServer(memoryConfig); //In memory MQTT server
}

@AfterAll
public static void tearDown() {
mqttServer.stopServer();
}

@BeforeEach
public void setup() throws IOException {
assertNotNull(iGateways);
Utilities.setIGateways(iGateways);
assertNotNull(Utilities.getIGateways());
Utilities.setObjectMapper(objectMapper);
setupDataProvider();
updateDevelopmentTeamsSetup(new DevelopmentTeamCreationParameters());

Files.createDirectories(Utilities.getCurrentApplicationDataPath());
Files.createDirectories(Utilities.getCurrentApplicationLogsPath());
}

@BeforeEach
public void setUp() {
// Common setup code here
// e.g., initializing beans, setting up data
setupDataProvider();
updateDevelopmentTeamsSetup(new DevelopmentTeamCreationParameters());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,16 @@
import dev.markodojkic.softwaredevelopmentsimulation.enums.DeveloperType;
import dev.markodojkic.softwaredevelopmentsimulation.model.DevelopmentTeamCreationParameters;
import dev.markodojkic.softwaredevelopmentsimulation.model.Developer;
import dev.markodojkic.softwaredevelopmentsimulation.test.Config.SoftwareDevelopmentSimulationAppBaseTest;
import org.apache.logging.log4j.util.Strings;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.*;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class DataProviderTest {
@BeforeAll
public static void preSetup(){
setupDataProvider(true);
}

class DataProviderTest extends SoftwareDevelopmentSimulationAppBaseTest {
@Test
void when_updateDevelopmentTeamsSetup_currentDevelopmentTeamsSetupIsPopulated_withReplacementOfOldValues() {
DevelopmentTeamCreationParameters parameters = new DevelopmentTeamCreationParameters();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,15 @@

import dev.markodojkic.softwaredevelopmentsimulation.enums.DeveloperType;
import dev.markodojkic.softwaredevelopmentsimulation.model.Developer;
import org.junit.jupiter.api.BeforeAll;
import dev.markodojkic.softwaredevelopmentsimulation.test.Config.SoftwareDevelopmentSimulationAppBaseTest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static dev.markodojkic.softwaredevelopmentsimulation.util.DataProvider.setupDataProvider;
import static org.junit.jupiter.api.Assertions.*;

class DeveloperTest {
class DeveloperTest extends SoftwareDevelopmentSimulationAppBaseTest {
private Developer developer;

@BeforeAll
public static void preSetup(){
setupDataProvider(true);
}

@BeforeEach
public void setup() {
developer = new Developer();
Expand All @@ -31,6 +25,7 @@ void when_noArgsConstructorIsCalled_correctValuesAreSetAsDefault() {
assertNull(developer.getYugoslavianUMCN());
assertNull(developer.getPlaceOfBirth());
assertEquals(DeveloperType.INTERN_DEVELOPER, developer.getDeveloperType());
assertEquals("Intern developer", developer.getDeveloperType().getDisplayName());
assertEquals(0L, developer.getExperienceCoefficient());
}

Expand Down Expand Up @@ -65,14 +60,16 @@ void testToString() {

@Test
void when_equalsOrHashCodeIsCalled_onEqualObjectAreSame_onNonEqualObjectsAreDifferent() {
Developer developer1 = new Developer("John Doe", "1234567890123", DeveloperType.SENIOR_DEVELOPER, false, 2L);
Developer developer2 = new Developer("John Doe", "1234567890123", DeveloperType.SENIOR_DEVELOPER, false, 2L);
Developer developer1 = new Developer("John Doe", "1234567858123", DeveloperType.SENIOR_DEVELOPER, false, 2L);
Developer developer2 = new Developer("John Doe", "1234567858123", DeveloperType.SENIOR_DEVELOPER, false, 2L);
Developer developer3 = new Developer("Alice Johnson", "9876543210987", DeveloperType.INTERN_DEVELOPER, true, 1L);

assertEquals(developer1, developer2);
assertEquals(developer1.hashCode(), developer2.hashCode());

assertNotEquals(developer1, developer3);
assertNotEquals(developer1.hashCode(), developer3.hashCode());

assertNotEquals("John Doe", developer1);
}
}
Loading

0 comments on commit 803b654

Please sign in to comment.