diff --git a/README.md b/README.md
index e75f4549..5466d09f 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,12 @@
# Java Exercise
-This is a simple exercise to allow you to demostrate your software engineering skillset. It's completly up to you how long you give yourself, stop when you're happy with the quality of your work, but we don't expect it to take too long.
-
-## Instructions
- 1. Please fork this repository and work on your fork.
- _https://help.github.com/en/articles/fork-a-repo_
- 2. Commit changes frequently so that we can review your progression with you later.
- _https://crealytics.com/blog/5-reasons-keeping-git-commits-small/_
- 3. You should use a recognised build tool, e.g. _gradle_, _maven_...
- 4. We are currently using [open JDK 8u181](https://cdn.azul.com/zulu/bin/zulu8.31.0.1-jdk8.0.181-win_x64.msi). But please use the JDK you think is most appropriate to demonstrate your skillset.
- 5. We don't expect 100% code coverage, we expect well tested code.
- _https://medium.com/@nicklee1/why-test-code-coverage-targets-are-a-bad-idea-1b9b8ef711ef_
- 6. Any other tools or libraries used must be freely available. Any third-party jars must be accessible via [maven central](https://mvnrepository.com/repos/central).
- 7. The specification is below.
+This is a simple exercise done by Mehmet Sibar. The application can run via command line. It will ask a few questions to fill the shopping cart. At the end of it, the application should show your cart and the total price.
+
+It's best to run the test to see how the application performs.
+
+The command-line interface has not designed very well as the main focus is the code quality and logic.
+
+
## Specification
@@ -35,12 +29,6 @@ Henry’s Grocery, currently only stocks four items and has two promotions. Thes
| :--- | :---: | :---: |
| Buy 2 tins of soup and get a loaf of bread half price | yesterday | for 7 days |
| Apples have a 10% discount | from 3 days hence | until the end of the following month |
-
-### Inputs
- All basket items added via the command prompt.
-
-### Outputs
-All outputs must print to the command line.
### Tests
- Price a basket containing: 3 tins of soup and 2 loaves of bread, bought today,
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..030c01a3
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,17 @@
+plugins {
+ id 'java'
+}
+
+group 'com.ford.exercise'
+version '1.0-SNAPSHOT'
+
+sourceCompatibility = 1.8
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ testCompile group: 'org.hamcrest', name: 'java-hamcrest', version: '2.0.0.0'
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/build/classes/java/main/cart/ShoppingCart.class b/build/classes/java/main/cart/ShoppingCart.class
new file mode 100644
index 00000000..4ca6a3f6
Binary files /dev/null and b/build/classes/java/main/cart/ShoppingCart.class differ
diff --git a/build/classes/java/main/item/Item.class b/build/classes/java/main/item/Item.class
new file mode 100644
index 00000000..089d7dab
Binary files /dev/null and b/build/classes/java/main/item/Item.class differ
diff --git a/build/classes/java/main/item/PriceCalculator.class b/build/classes/java/main/item/PriceCalculator.class
new file mode 100644
index 00000000..7f25f265
Binary files /dev/null and b/build/classes/java/main/item/PriceCalculator.class differ
diff --git a/build/classes/java/main/item/Unit.class b/build/classes/java/main/item/Unit.class
new file mode 100644
index 00000000..11c67545
Binary files /dev/null and b/build/classes/java/main/item/Unit.class differ
diff --git a/build/classes/java/test/unit/GroceryTest.class b/build/classes/java/test/unit/GroceryTest.class
new file mode 100644
index 00000000..ba45a96c
Binary files /dev/null and b/build/classes/java/test/unit/GroceryTest.class differ
diff --git a/build/reports/tests/test/classes/unit.GroceryTest.html b/build/reports/tests/test/classes/unit.GroceryTest.html
new file mode 100644
index 00000000..0ff28d77
--- /dev/null
+++ b/build/reports/tests/test/classes/unit.GroceryTest.html
@@ -0,0 +1,387 @@
+
+
+
java.lang.NullPointerException
+ at cart.ShoppingCart.lambda$calculate$0(ShoppingCart.java:23)
+ at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
+ at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
+ at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
+ at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
+ at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
+ at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+ at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:474)
+ at cart.ShoppingCart.calculate(ShoppingCart.java:23)
+ at unit.GroceryTest.applyAllDiscountsWhenConditionAndDateValid(GroceryTest.java:56)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
+ at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
+ at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+ at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+ at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+ at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+ at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+ at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+ at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+ at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
+ at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
+ at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
+ at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
+ at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
+ at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
+ at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
+ at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
+ at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
+ at java.lang.Thread.run(Thread.java:748)
+
+
+
+
+
+
applyDiscountToApplesWhenDiscountDateValid
+
+
java.lang.NullPointerException
+ at cart.ShoppingCart.lambda$calculate$0(ShoppingCart.java:23)
+ at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
+ at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
+ at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
+ at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
+ at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
+ at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+ at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:474)
+ at cart.ShoppingCart.calculate(ShoppingCart.java:23)
+ at unit.GroceryTest.applyDiscountToApplesWhenDiscountDateValid(GroceryTest.java:43)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
+ at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
+ at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+ at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+ at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+ at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+ at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+ at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+ at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+ at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
+ at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
+ at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
+ at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
+ at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
+ at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
+ at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
+ at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
+ at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
+ at java.lang.Thread.run(Thread.java:748)
+
+
+
+
+
+
applyDiscountToOneBreadWhenThreeTinsOfSoupBought
+
+
java.lang.NullPointerException
+ at cart.ShoppingCart.lambda$calculate$0(ShoppingCart.java:23)
+ at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
+ at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
+ at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
+ at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
+ at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
+ at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+ at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:474)
+ at cart.ShoppingCart.calculate(ShoppingCart.java:23)
+ at unit.GroceryTest.applyDiscountToOneBreadWhenThreeTinsOfSoupBought(GroceryTest.java:21)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
+ at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
+ at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+ at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+ at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+ at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+ at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+ at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+ at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+ at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
+ at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
+ at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
+ at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
+ at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
+ at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
+ at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
+ at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
+ at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
+ at java.lang.Thread.run(Thread.java:748)
+
+
+
+
+
+
dontApplyDiscountWhenDiscountDateInvalid
+
+
java.lang.NullPointerException
+ at cart.ShoppingCart.lambda$calculate$0(ShoppingCart.java:23)
+ at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
+ at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1556)
+ at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
+ at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
+ at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
+ at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+ at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:474)
+ at cart.ShoppingCart.calculate(ShoppingCart.java:23)
+ at unit.GroceryTest.dontApplyDiscountWhenDiscountDateInvalid(GroceryTest.java:32)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
+ at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+ at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
+ at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+ at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
+ at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+ at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
+ at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
+ at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
+ at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
+ at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
+ at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
+ at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
+ at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
+ at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
+ at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
+ at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
+ at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
+ at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
+ at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
+ at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
+ at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
+ at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
+ at java.lang.Thread.run(Thread.java:748)
+