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