| # Instantiating Components | |
| There are a few techniques for creating instances classes in unit tests: | |
| * Use a mocking library. **(Deprecated)** | |
| * Provide a simple implementation of an interface | |
| * Build a real instance of class using the class's builders / constructors | |
| * Use the [ClusterFixture](ClusterFixture.md) or [OperatorFixture](OperatorFixture.md) classes to create instances of objects. | |
| ## Mocking Libraries (Deprecated) | |
| Drill uses two mocking libraries in order to mock classes. | |
| * [Mockito](http://site.mockito.org) | |
| * [JMockit](http://jmockit.github.io/tutorial.html) | |
| These libraries were originally used to work around the lack of well defined interfaces and adequate testing tools. Drill has made significant improvements in these areas | |
| so using mocking libraries are no longer required. Existing tests that use these libraries will be refactored to remove them, and new tests should NOT use these libraries. | |
| ## Instantiating Contexts | |
| There are several contexts used throughout Drill, for a complete description of each and how | |
| they are used please see [FragmentContextImpl](../../exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContextImpl.java). | |
| When doing tests you can use the following mock contexts: | |
| * [MockFragmentContext](../../exec/java-exec/src/test/java/org/apache/drill/test/OperatorFixture.java) is a simple mock implementation of | |
| the [FragmentContext](../../exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java). A mock instance of the class can also be retrieved from an | |
| [OperatorFixture](OperatorFixture.md). | |
| ``` | |
| FragmentContext context = operatorFixture.getFragmentContext(); | |
| ``` | |
| ## Creating An Instance of [QueryId](../../protocol/src/main/java/org/apache/drill/exec/proto/beans/QueryId.java) | |
| ``` | |
| UserBitShared.QueryId queryId = UserBitShared.QueryId.newBuilder() | |
| .setPart1(1L) | |
| .setPart2(2L) | |
| .build(); | |
| ``` | |
| ## Creating [FragmentHandle](../../protocol/src/main/java/org/apache/drill/exec/proto/beans/FragmentHandle.java) | |
| ``` | |
| ExecProtos.FragmentHandle fragmentHandle = ExecProtos.FragmentHandle.newBuilder() | |
| .setQueryId(queryId) | |
| .setMinorFragmentId(1) | |
| .setMajorFragmentId(2) | |
| .build(); | |
| ``` | |
| ## Creating A [DrillConfig](../../common/src/main/java/org/apache/drill/common/config/DrillConfig.java) | |
| There are a few ways to create a [DrillConfig](../../common/src/main/java/org/apache/drill/common/config/DrillConfig.java). The simplest way is to | |
| create a [ClusterFixture](ClusterFixture.md) or [OperatorFixture](OperatorFixture.md) and then do the following: | |
| ``` | |
| DrillConfig drillConfig = clusterFixture.config(); | |
| ``` | |
| or | |
| ``` | |
| DrillConfig drillConfig = operatorFixture.config(); | |
| ``` | |
| If you need a [DrillConfig](../../common/src/main/java/org/apache/drill/common/config/DrillConfig.java) and don't want all the extra things provided | |
| by [ClusterFixture](ClusterFixture.md) and [OperatorFixture](OperatorFixture.md), you can use | |
| [ConfigBuilder](../../exec/java-exec/src/test/java/org/apache/drill/test/ConfigBuilder.java). | |
| ## Creating A [SpillSet](../../exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/spill/SpillSet.java) | |
| 1. Create a [PhysicalOperator](../../exec/java-exec/src/main/java/org/apache/drill/exec/physical/base/PhysicalOperator.java). | |
| ``` | |
| HashJoinPOP pop = new HashJoinPOP(null, null, null, JoinRelType.FULL); | |
| ``` | |
| 1. Create a [DrillConfig](../../common/src/main/java/org/apache/drill/common/config/DrillConfig.java). | |
| 1. Create a [FragmentHandle](../../protocol/src/main/java/org/apache/drill/exec/proto/beans/FragmentHandle.java) as described above. | |
| 1. Create a [SpillSet](../../exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/spill/SpillSet.java). | |
| ``` | |
| SpillSet spillSet = new SpillSet(config, fragmentHandle, pop); | |
| ``` | |
| ## Creating A [PersistentStoreProvider](../../exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/PersistentStoreProvider.java) | |
| ``` | |
| LocalPersistentStoreProvider provider = new LocalPersistentStoreProvider(drillConfig); | |
| provider.start(); | |
| ``` | |
| ## Creating A [LogicalPlanPersistence](../../logical/src/main/java/org/apache/drill/common/config/LogicalPlanPersistence.java) | |
| ``` | |
| LogicalPlanPersistence logicalPlanPersistence = PhysicalPlanReaderTestFactory.defaultLogicalPlanPersistence(drillConfig); | |
| ``` | |
| ## Creating An Instance Of An Option Manager | |
| You can create an instance of the [SystemOptionManager](../../exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java) by leveraging the | |
| [OperatorFixture](OperatorFixture.md). | |
| 1. Create an [OperatorFixture](OperatorFixture.md). | |
| 1. Retrieve the [SystemOptionManager](../../exec/java-exec/src/main/java/org/apache/drill/exec/server/options/SystemOptionManager.java). | |
| ``` | |
| operatorFixture.getOptionManager(); | |
| ``` |