From 6090088cead423483d5d05ed4de279b89b89546f Mon Sep 17 00:00:00 2001 From: Julian Dehne <julian.dehne@uni-potsdam.de> Date: Mon, 16 Jul 2018 16:28:04 +0200 Subject: [PATCH] bug: fixed problem in mocking --- .../gf/config/GFApplicationBinder.java | 3 + .../unipotsdam/gf/core/states/PhasesImpl.java | 8 +- .../gf/core/testsandbox/TestList.java | 6 ++ .../core/testsandbox/TestListInterface.java | 4 + .../unipotsdam/gf/interfaces/IPhases.java | 6 ++ .../peer2peerfeedback/DummyFeedback.java | 4 +- .../DummyResearchReportCounter.java | 6 ++ .../DummyResearchReportManagement.java | 25 ++++- .../ResearchReportManagement.java | 15 +++ .../gf/interfaces/ActivityFlowTest.java | 36 ++++--- .../gf/testsandbox/TestTestTest.java | 100 ++++++++++++++++++ 11 files changed, 189 insertions(+), 24 deletions(-) create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestList.java create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestListInterface.java create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportCounter.java create mode 100644 gemeinsamforschen/src/test/java/unipotsdam/gf/testsandbox/TestTestTest.java diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java index e606a19e..2daf3651 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -4,6 +4,8 @@ import org.glassfish.hk2.utilities.binding.AbstractBinder; import unipotsdam.gf.core.management.Management; import unipotsdam.gf.core.management.ManagementImpl; import unipotsdam.gf.core.states.PhasesImpl; +import unipotsdam.gf.core.testsandbox.TestList; +import unipotsdam.gf.core.testsandbox.TestListInterface; import unipotsdam.gf.interfaces.*; import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment; import unipotsdam.gf.modules.assessment.controller.service.PeerAssessmentDummy; @@ -31,5 +33,6 @@ public class GFApplicationBinder extends AbstractBinder { bind(PhasesImpl.class).to(IPhases.class); bind(ManagementImpl.class).to(Management.class); bind(DummyResearchReportManagement.class).to(ResearchReportManagement.class); + bind(TestList.class).to(TestListInterface.class); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java index f41a8eee..85dc6d81 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java @@ -118,9 +118,7 @@ public class PhasesImpl implements IPhases { } - - - - - + public void setFeedback(Feedback feedback) { + this.feedback = feedback; + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestList.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestList.java new file mode 100644 index 00000000..b97885ac --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestList.java @@ -0,0 +1,6 @@ +package unipotsdam.gf.core.testsandbox; + +import java.util.ArrayList; + +public class TestList extends ArrayList implements TestListInterface { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestListInterface.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestListInterface.java new file mode 100644 index 00000000..f541c498 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/testsandbox/TestListInterface.java @@ -0,0 +1,4 @@ +package unipotsdam.gf.core.testsandbox; + +public interface TestListInterface extends java.util.List { +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java index f98b67a9..976d67d1 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPhases.java @@ -10,4 +10,10 @@ public interface IPhases { * @param project */ public void endPhase(ProjectPhase projectPhase, Project project); + + /** + * the dependency to feedback should be settable externally for test reasons + * @param feedback + */ + void setFeedback(Feedback feedback); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java index b93f0e8c..f01e37c6 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java @@ -17,6 +17,7 @@ public class DummyFeedback implements Feedback { */ PodamFactory factory = new PodamFactoryImpl(); + private static Boolean missingTaskAssigned = false; @Override public Peer2PeerFeedback createPeer2PeerFeedbackmask( @@ -43,12 +44,13 @@ public class DummyFeedback implements Feedback { public Boolean checkFeedbackConstraints(Project project) { // TODO implement cornstaints System.out.println("Checking fake constraints"); - return true; + return missingTaskAssigned; } @Override public void assigningMissingFeedbackTasks(Project project) { System.out.println("assigning fake tasks"); + missingTaskAssigned = true; } @Override diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportCounter.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportCounter.java new file mode 100644 index 00000000..b1451156 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportCounter.java @@ -0,0 +1,6 @@ +package unipotsdam.gf.modules.researchreport; + +public class DummyResearchReportCounter { + + public static Boolean feedbackTasksNotAssigned = true; +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java index 44d8648e..7f7c0967 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/DummyResearchReportManagement.java @@ -1,7 +1,5 @@ package unipotsdam.gf.modules.researchreport; -import org.mockito.Mock; -import sun.reflect.generics.reflectiveObjects.NotImplementedException; import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; import unipotsdam.gf.core.management.project.Project; @@ -14,15 +12,27 @@ import java.io.File; public class DummyResearchReportManagement implements ResearchReportManagement { + /** * Utility to creaty dummy data for students */ PodamFactory factory = new PodamFactoryImpl(); + + @Inject + Feedback feedback; + @Override public String createResearchReport( ResearchReport researchReport, Project project, User student) { + // real implementation should check if all the constraints are ok before starting with feedbacks + // this assumes uploading and giving feedback is in the same phase (no teacher decision to go from + // uploading dossiers to feedback + if (DummyResearchReportCounter.feedbackTasksNotAssigned) { + DummyResearchReportCounter.feedbackTasksNotAssigned = false; + feedback.assignFeedbackTasks(); + } return factory.manufacturePojo(ResearchReport.class).getId(); } @@ -40,4 +50,15 @@ public class DummyResearchReportManagement implements ResearchReportManagement { public File getResearchReport(ResearchReport researchReport) { return null; } + + @Override + public void createFinalResearchReport( + ResearchReport researchReport, Project project, User student) { + + } + + @Override + public void setFeedback(Feedback feedback) { + this.feedback = feedback; + } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java index 65505044..edcce596 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/researchreport/ResearchReportManagement.java @@ -2,6 +2,7 @@ package unipotsdam.gf.modules.researchreport; import unipotsdam.gf.core.management.project.Project; import unipotsdam.gf.core.management.user.User; +import unipotsdam.gf.interfaces.Feedback; import java.io.File; @@ -48,5 +49,19 @@ public interface ResearchReportManagement { File getResearchReport(ResearchReport researchReport); + /** + * This represents a second version of the research report where the feedback is incorporated + * There is only this second version. Otherwise we could cycle the dossier upload and feedback (would be to + * complicated) + * @param researchReport + * @param project + * @param student + */ + void createFinalResearchReport(ResearchReport researchReport, Project project, User student); + /** + * the dependency to feedback should be settable externally for test reasons + * @param feedback + */ + void setFeedback(Feedback feedback); } diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java index c8e76986..bc3c725f 100644 --- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java @@ -7,6 +7,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoRule; @@ -35,9 +38,6 @@ import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class ActivityFlowTest { - - Boolean mocked = true; - /** * Utility to creaty dummy data for students */ @@ -49,12 +49,11 @@ public class ActivityFlowTest { @Inject ResearchReportManagement researchReportManagement; - @Mock - Feedback mockfeedback; @Inject Feedback feedback; + @Inject IPhases phases; @@ -69,9 +68,14 @@ public class ActivityFlowTest { public void setUp() { final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); locator.inject(this); - } + feedback = Mockito.spy(feedback); + researchReportManagement = Mockito.spy(researchReportManagement); + phases = Mockito.spy(phases); + researchReportManagement.setFeedback(feedback); + phases.setFeedback(feedback); + } @Test public void activityPlayer() { @@ -126,17 +130,16 @@ public class ActivityFlowTest { public void uploadDossiers() { + for (User student : students) { // persist dossiers ResearchReport researchReport = factory.manufacturePojo(ResearchReport.class); researchReportManagement.createResearchReport(researchReport, project, student); } - if (mocked) { - mockfeedback.assignFeedbackTasks(); - } + // assert that after the last report has been submitted, the feedback tasks were assigned automatically - verify(mockfeedback, times(1)).assignFeedbackTasks(); + verify(feedback).assignFeedbackTasks(); // students give feedback for (User student : students) { @@ -158,20 +161,20 @@ public class ActivityFlowTest { Iterator<User> students2Iterator = students2.iterator(); while (students2Iterator.hasNext()) { User student = students2Iterator.next(); - // persist dossiers (versioning) + // persist final dossiers -- assuming this function is intended + // if only one time upload is intended and feedback is not incorporated into a final dossier + // you should change this test to reflect only one time upload + // i.e. removing one student above to reflect no compliance ResearchReport researchReport = factory.manufacturePojo(ResearchReport.class); - researchReportManagement.createResearchReport(researchReport, project, student); + researchReportManagement.createFinalResearchReport(researchReport, project, student); } // docent finishes phase phases.endPhase(ProjectPhase.DossierFeedback, project); - if (mocked) { - mockfeedback.assigningMissingFeedbackTasks(project); - } // student misses mockfeedback -> reassignment // assert that while reports are still missing mockfeedback tasks are reassigned - verify(mockfeedback, times(1)).assigningMissingFeedbackTasks(project); + verify(feedback).assigningMissingFeedbackTasks(project); // assert that everybody has given and received mockfeedback assertTrue(feedback.checkFeedbackConstraints(project)); @@ -192,4 +195,5 @@ public class ActivityFlowTest { // } + } diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/testsandbox/TestTestTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/testsandbox/TestTestTest.java new file mode 100644 index 00000000..5cbe3ac4 --- /dev/null +++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/testsandbox/TestTestTest.java @@ -0,0 +1,100 @@ +package unipotsdam.gf.testsandbox; + + +import org.glassfish.hk2.api.ServiceLocator; +import org.glassfish.hk2.utilities.ServiceLocatorUtilities; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import unipotsdam.gf.config.GFApplicationBinder; +import unipotsdam.gf.core.testsandbox.TestListInterface; + +import javax.inject.Inject; +import java.util.ArrayList; + +import static junit.framework.Assert.assertEquals; + +@RunWith(MockitoJUnitRunner.class) +public class TestTestTest { + + + @Spy + java.util.List<String> spiedList = new ArrayList<String>(); + + + @Inject + TestListInterface spiedList2; + + + + @Inject + @Spy + TestListInterface spiedList3; + + @Before + public void setUp() { + final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); + locator.inject(this); + } + + + // GEHT + @Test + public void howSpiesWork() { + java.util.List<String> spiedList = Mockito.spy(new ArrayList<String>()); + Mockito.spy(spiedList); + + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + } + + + // GEHT + @Test + public void howSpiesWorkWithAnnotation() { + + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + } + + // GEHT + @Test + public void howSpiesWorkWithInjection() { + + java.util.List<String> spiedList = Mockito.spy(spiedList2); + + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + } + + // GEHT NICHT! + @Test + public void howSpiesWorkWithInjectionAndAnnotation() { + + spiedList3.add("one"); + spiedList3.add("two"); + + Mockito.verify(spiedList3).add("one"); + Mockito.verify(spiedList3).add("two"); + + assertEquals(2, spiedList3.size()); + } +} -- GitLab