{"id":16696966,"url":"https://github.com/seratch/junithelper","last_synced_at":"2025-03-21T19:31:32.551Z","repository":{"id":2718732,"uuid":"3713233","full_name":"seratch/junithelper","owner":"seratch","description":"JUnit testing without dull routine","archived":false,"fork":false,"pushed_at":"2017-03-30T15:51:16.000Z","size":14612,"stargazers_count":30,"open_issues_count":4,"forks_count":16,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-18T04:16:10.458Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://junithelper.org/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seratch.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-03-14T01:11:55.000Z","updated_at":"2019-08-13T14:58:47.000Z","dependencies_parsed_at":"2022-09-03T12:01:26.174Z","dependency_job_id":null,"html_url":"https://github.com/seratch/junithelper","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fjunithelper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fjunithelper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fjunithelper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fjunithelper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seratch","download_url":"https://codeload.github.com/seratch/junithelper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244855467,"owners_count":20521648,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T17:45:30.015Z","updated_at":"2025-03-21T19:31:31.701Z","avatar_url":"https://github.com/seratch.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JUnit Helper\n\n## What's this?\n\n\"JUnit Helper\" helps JUnit users to cover all tests for public, protected and package local methods by saving much labor to start writing new test cases. \n\nCurrently, command line script, Maven plugin and Eclipse IDE plugin are provided. Eclipse plugin also has an advantage of making it easier to go back and forth between developing class and test class by \"Alt + 8 \"(test-\u003edev) and \"Alt + 9\"(dev-\u003etest).\n\n## JUnit testing without dull routine\n\nWe developers have to do two non-essential dull routine in JUnit testing.\n\nFirst, it takes no small cost to prepare a new test case. A general procedure to prepare a JUnit test case might be like this - (1) Creating package and test class (2) Defining test methods (3) Finding out how to instantiate (4) Preparing required args, (5) Starting writing logic at last.\n\nJUnit Helper automates (1) - (4) of above. Developers can focus on writing logic.\n\nAnd second, it is a hard job to ascertain whether the test case aimed to add already exists in a huge test class that might not be maintained for a long time. \n\nJUnit Helper deals with the problem by using a naming convention of test methods that is based on method signature. For example, \"public void doSomething(String arg)\" -\u003e \"@Test public void doSomething_A$String() throws Exception\". The naming rule is customizable to meet some needs.\n\n## Overview\n\nIf you want to test the following method:\n\n```java\npublic SearchResult search(SearchCondition condition) {\n  return null;\n}\n```\n\nCarry out whichever operation:\n\n* Command Line Script (for Windows, Mac OS X, UNIX)\n\n```sh\n./junithelper(.bat) make src/main/java\n```\n\n* Maven\n\n```sh\nmvn junithelper:make\n```\n\n* Eclipse plugin\n\nSelect Java file and \"Alt + 9\"\n\nJUnit Helper outputs the following test method:\n\n```java\n@Test\npublic void search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  Sample target = new Sample();\n  SearchCondition condition = null;\n  SearchResult actual = target.search(condition);\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\nJUnit 3.x style is also available:\n\n```java\npublic void test_search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  ...\n```\n\nIt will be provided without compile errors in most cases. For example, if the args contain primitives or arrays,\n\n```java\npublic SearchResult search(String[] array, List\u003cString\u003e list, long primitive, Version version) {\n  return null;\n}\n```\n\nlike this:\n\n```java\n@Test\npublic void search_A$StringArray$List$long$Version() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  Sample target = new Sample();\n  String[] array = new String[] {};\n  List\u003cString\u003e list = new ArrayList\u003cString\u003e();\n  long primitive = 0L;\n  Version version = null;\n  SearchResult actual = target.search(array, list, primitive, version);\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\n\"search_A$SearchCondition\" or \"search_A$StringArray$List$long$Version\" is the part to specify which method it tests. Delimiters and some other rules are customizable.\n\nIf you want to have several cases for same method, it's a standard way to discriminate them by method name suffix.\n\n```java\n@Test\npublic void search_A$SearchCondition_null() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  ...\n}\n\n@Test\npublic void search_A$SearchCondition_empty() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  ...\n}\n\n@Test\npublic void search_A$SearchCondition_paging() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  ...\n}\n```\n\nIf you add a new method, \n\n```java\npublic List\u003cString\u003e addedMethod(InputStream is) {\n  return null;\n}\n```\n\nJUnit Helper also adds a test method by make command or \"Alt + 9\" on Eclipse:\n\n```java\n@Test\npublic void addedMethod_A$InputStream() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  ...\n```\n\n## With mock object frameworks\n\nIf you want, JUnit Helper is also able to generate template test code with mock object frameworks:\n\n### Mockito\n\n```java\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.*;\nimport static org.mockito.BDDMockito.*;\n\n@Test\npublic void search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  Sample target = new Sample();\n  // given\n  SearchCondition condition = mock(SearchCondition.class);\n  // e.g. : given(mocked.called()).willReturn(1);\n  // when\n  SearchResult actual = target.search(condition);\n  // then\n  // e.g. : verify(mocked).called();\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\n### JMock2\n\n```java\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.*;\nimport org.jmock.Mockery;\nimport org.jmock.Expectations;\nimport org.jmock.lib.legacy.ClassImposteriser;\n\n@Test\npublic void search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  Mockery context = new Mockery(){{\n    setImposteriser(ClassImposteriser.INSTANCE);\n  }};\n  Sample target = new Sample();\n  final SearchCondition condition = context.mock(SearchCondition.class);\n  context.checking(new Expectations(){{\n    // e.g. : allowing(mocked).called(); will(returnValue(1));\n  }});\n  SearchResult actual = target.search(condition);\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\n### EasyMock\n\n```java\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.*;\nimport org.easymock.classextension.EasyMock;\nimport org.easymock.classextension.IMocksControl;\n\n@Test\npublic void search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  IMocksControl mocks = EasyMock.createControl();\n  Sample target = new Sample();\n  SearchCondition condition = mocks.createMock(SearchCondition.class);\n  // e.g. : EasyMock.expect(mocked.called()).andReturn(1);\n  mocks.replay();\n  SearchResult actual = target.search(condition);\n  mocks.verify();\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\n### JMockit\n\n```java\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.*;\nimport mockit.Mocked;\nimport mockit.Expectations;\n\n@Mocked \nSearchCondition search_A$SearchCondition_condition;\n\n@Test\npublic void search_A$SearchCondition() throws Exception {\n  // TODO auto-generated by JUnit Helper.\n  Sample target = new Sample();\n  SearchCondition condition = this.search_A$SearchCondition_condition;\n  new Expectations(){{\n    // e.g. : mocked.get(anyString); returns(200);\n  }};\n  SearchResult actual = target.search(condition);\n  SearchResult expected = null;\n  assertThat(actual, is(equalTo(expected));\n}\n```\n\n# Eclipse Plugin\n\n## How to install\n\n* Update site\n\n http://junithelper.org/eclipse/plugins/site.xml\n\n* Eclipse marketplace\n\n http://marketplace.eclipse.org/content/junit-helper\n\n## How to use\n\nIt is very simple, only two shortcut-commands.The following commands are available on Java Editor, Package Explorer and Navigator.\n\n### Commands\n\n* Alt + 8\n\n Open target class from test when selecting test class, open test target class.\n\n* Alt + 9\n\n![new_test_case](http://junithelper.org/img/new_test_case.png)\n\n Open test class or create test class if it does not exist when selecting test target class.\n If some methods that have no tests existed, the minimal test methods will be generated automatically.\n\n![junit4](http://junithelper.org/img/junit4.png)\n\n JUnit 3.x style is also available:\n\n![junit3](http://junithelper.org/img/junit3.png)\n\n* Alt + 3\n\n Change current test case to JUnit 3.x style.\n\n* Alt + 4\n\n Change current test case to JUnit 4.x style.\n\n### Preference\n\n* Window \u003e Preferences \u003e JUnit Helper\n\n![preference](http://junithelper.org/img/preferences_1.10.png)\n\n If you need a project-specific configuration, put \"junithelper-config.properties\" in the project root directory. It will be put above global configuration in Eclipse.\n\n```\n# language:en/ja\nlanguage:en\noutputFileEncoding:UTF-8\ndirectoryPathOfProductSourceCode:src/main/java\ndirectoryPathOfTestSourceCode:src/test/java\n# lineBreakPolicy:forceCRLF/forceLF/forceNewFileCRLF/forceNewFileLF\nlineBreakPolicy=forceNewFileCRLF\nuseSoftTabs=false\nsoftTabSize=4\n# junitVersion:version3/version4\njunitVersion:version4\ntestCaseClassNameToExtend:junit.framework.TestCase\nisTemplateImplementationRequired:true\ntarget.isAccessorExcluded:true\ntarget.isExceptionPatternRequired:true\ntarget.isPackageLocalMethodRequired:true\ntarget.isProtectedMethodRequired:true\ntarget.isPublicMethodRequired:true\n# target.regexpCsvForExclusion:com/.example/..+.autogenerated/..+,com/.example/.NoNeedToTest\ntarget.regexpCsvForExclusion:\ntestMethodName.isArgsRequired:true\ntestMethodName.isReturnRequired:false\ntestMethodName.basicDelimiter:_\ntestMethodName.argsAreaPrefix:A\ntestMethodName.argsAreaDelimiter:$\ntestMethodName.returnAreaPrefix:R\ntestMethodName.returnAreaDelimiter:$\ntestMethodName.exceptionAreaPrefix:T\ntestMethodName.exceptionAreaDelimiter:$\n# mockObjectFramework:Mockito/JMock2/JMockit/EasyMock\nmockObjectFramework:\n# testingPatternExplicitComment:ArrangeActAssert/GivenWhenThen\ntestingPatternExplicitComment:\nisExtensionEnabled:true\nextensionConfigXML:junithelper-extension.xml\n```\n\n# Command Line Script\n\n## How to install\n\n* Zip archive (junithelper-core-X.X.X.zip)\n\n https://github.com/seratch/junithelper/downloads\n\n## How to use\n\n```sh\n$ ./tools/junithelper.bat\n  _\n   /   _  ._/_/_/_  /_  _  _\n(_//_// // / / //_'//_//_'/\n                   /\nJUnit Helper version 1.12\n\n\nUsage:\n  junithelper [command] [arg1] [arg2]\n\nCommands:\n  junithelper make [baseDir/targetJavaFile]\n  junithelper force3 [baseDir/targetJavaFile]\n  junithelper force4 [baseDir/targetJavaFile]\n\nJVM Options:\n  -Djunithelper.configProperties=[filepath]\n\n$\n```\n\n* make command\n\nThis command creates test cases or methods for the classes under specified package recursively.\n\n```sh\n$ ./tools/junithelper.bat make ./src/main/java/org/junithelper/core/util/\n  _\n   /   _  ._/_/_/_  /_  _  _\n(_//_// // / / //_'//_//_'/\n                   /\nJUnit Helper version 1.12\n\n\n  Target: C:/workspace/junithelper-core/./src/main/java/org/junithelper/core/util/IOUtil.java\n  Target: C:/workspace/junithelper-core/./src/main/java/org/junithelper/core/util/ObjectUtil.java\n  Target: C:/workspace/junithelper-core/./src/main/java/org/junithelper/core/util/PrimitiveTypeUtil.java\n  Target: C:/workspace/junithelper-core/./src/main/java/org/junithelper/core/util/Stdout.java\n  Target: C:/workspace/junithelper-core/./src/main/java/org/junithelper/core/util/ThreadUtil.java\n\nAre you sure?(y/n)\ny\n  Modified: C:/workspace/junithelper-core/./src/test/java/org/junithelper/core/util/IOUtilTest.java\n  Modified: C:/workspace/junithelper-core/./src/test/java/org/junithelper/core/util/ObjectUtilTest.java\n  Modified: C:/workspace/junithelper-core/./src/test/java/org/junithelper/core/util/PrimitiveTypeUtilTest.java\n  Created: C:/workspace/junithelper-core/./src/test/java/org/junithelper/core/util/StdoutTest.java\n  Modified: C:/workspace/junithelper-core/./src/test/java/org/junithelper/core/util/ThreadUtilTest.java\n\n$\n```\n\n* force3 command\n\nThis command forces test cases JUnit 3.x style for the classes under specified package recursively.\n\n* force4 command\n\nThis command forces test cases JUnit 4.x style for the classes under specified package recursively.\n\n## Configuration\n\nYou can change the following Configurations by editing \"junithelper-config.properties\". Maven plugin's Configuration also uses same property names.\n\n```\n# language:en/ja\nlanguage:en\noutputFileEncoding:UTF-8\ndirectoryPathOfProductSourceCode:src/main/java\ndirectoryPathOfTestSourceCode:src/test/java\n# lineBreakPolicy:forceCRLF/forceLF/forceNewFileCRLF/forceNewFileLF\nlineBreakPolicy=forceNewFileCRLF\nuseSoftTabs=false\nsoftTabSize=4\n# junitVersion:version3/version4\njunitVersion:version4\ntestCaseClassNameToExtend:junit.framework.TestCase\nisTemplateImplementationRequired:true\ntarget.isAccessorExcluded:true\ntarget.isExceptionPatternRequired:true\ntarget.isPackageLocalMethodRequired:true\ntarget.isProtectedMethodRequired:true\ntarget.isPublicMethodRequired:true\n# target.regexpCsvForExclusion:com/.example/..+.autogenerated/..+,com/.example/.NoNeedToTest\ntarget.regexpCsvForExclusion:\ntestMethodName.isArgsRequired:true\ntestMethodName.isReturnRequired:false\ntestMethodName.basicDelimiter:_\ntestMethodName.argsAreaPrefix:A\ntestMethodName.argsAreaDelimiter:$\ntestMethodName.returnAreaPrefix:R\ntestMethodName.returnAreaDelimiter:$\ntestMethodName.exceptionAreaPrefix:T\ntestMethodName.exceptionAreaDelimiter:$\n# mockObjectFramework:Mockito/JMock2/JMockit/EasyMock\nmockObjectFramework:\n# testingPatternExplicitComment:ArrangeActAssert/GivenWhenThen\ntestingPatternExplicitComment:\nisExtensionEnabled:true\nextensionConfigXML:junithelper-extension.xml\n```\n\n# Maven Plugin\n\n## How to install\n\n * pom.xml\n\n```xml\n\u003cbuild\u003e\n    \u003cplugins\u003e\n        ...\n        \u003cplugin\u003e\n            \u003cgroupId\u003eorg.junithelper\u003c/groupId\u003e\n            \u003cartifactId\u003emaven-junithelper-plugin\u003c/artifactId\u003e\n        \u003c/plugin\u003e\n        ...\n    \u003c/plugins\u003e\n\u003c/build\u003e\n```\n\nFollowing is an example of configuration:\n\n```xml\n\u003cbuild\u003e\n    \u003cplugins\u003e\n        ...\n        \u003cplugin\u003e\n            \u003cgroupId\u003eorg.junithelper\u003c/groupId\u003e\n            \u003cartifactId\u003emaven-junithelper-plugin\u003c/artifactId\u003e\n            \u003cconfiguration\u003e\n                \u003c!-- language:en/ja --\u003e\n                \u003clanguage\u003een\u003c/language\u003e\n                \u003coutputFileEncoding\u003eUTF-8\u003c/outputFileEncoding\u003e\n                \u003c!-- lineBreakPolicy:forceCRLF/forceLF/forceNewFileCRLF/forceNewFileLF --\u003e\n                \u003clineBreakPolicy\u003eforceNewFileCRLF\u003c/lineBreakPolicy\u003e\n                \u003cuseSoftTabs\u003efalse\u003c/useSoftTabs\u003e\n                \u003csoftTabSize\u003e4\u003c/softTabSize\u003e\n                \u003cdirectoryPathOfProductSourceCode\u003esrc/main/java\u003c/directoryPathOfProductSourceCode\u003e\n                \u003cdirectoryPathOfTestSourceCode\u003esrc/test/java\u003c/directoryPathOfTestSourceCode\u003e\n                \u003c!-- junitVersion:version3/version4 --\u003e\n                \u003cjunitVersion\u003eversion4\u003c/junitVersion\u003e\n                \u003ctestCaseClassNameToExtend\u003ejunit.framework.TestCase\u003c/testCaseClassNameToExtend\u003e\n                \u003cisTemplateImplementationRequired\u003etrue\u003c/isTemplateImplementationRequired\u003e\n                \u003ctarget_isAccessorExcluded\u003etrue\u003c/target_isAccessorExcluded\u003e\n                \u003ctarget_isExceptionPatternRequired\u003etrue\u003c/target_isExceptionPatternRequired\u003e\n                \u003ctarget_isPackageLocalMethodRequired\u003etrue\u003c/target_isPackageLocalMethodRequired\u003e\n                \u003ctarget_isProtectedMethodRequired\u003etrue\u003c/target_isProtectedMethodRequired\u003e\n                \u003ctarget_isPublicMethodRequired\u003etrue\u003c/target_isPublicMethodRequired\u003e\n                \u003ctarget_regexpCsvForExclusion\u003e\u003c/target_regexpCsvForExclusion\u003e\n                \u003ctestMethodName_isArgsRequired\u003etrue\u003c/testMethodName_isArgsRequired\u003e\n                \u003ctestMethodName_isReturnRequired\u003efalse\u003c/testMethodName_isReturnRequired\u003e\n                \u003ctestMethodName_basicDelimiter\u003e_\u003c/testMethodName_basicDelimiter\u003e\n                \u003ctestMethodName_argsAreaPrefix\u003eA\u003c/testMethodName_argsAreaPrefix\u003e\n                \u003ctestMethodName_argsAreaDelimiter\u003e$\u003c/testMethodName_argsAreaDelimiter\u003e\n                \u003ctestMethodName_returnAreaPrefix\u003eR\u003c/testMethodName_returnAreaPrefix\u003e\n                \u003ctestMethodName_returnAreaDelimiter\u003e$\u003c/testMethodName_returnAreaDelimiter\u003e\n                \u003ctestMethodName_exceptionAreaPrefix\u003eT\u003c/testMethodName_exceptionAreaPrefix\u003e\n                \u003ctestMethodName_exceptionAreaDelimiter\u003e$\u003c/testMethodName_exceptionAreaDelimiter\u003e\n                \u003c!-- mockObjectFramework:Mockito/JMock2/JMockit/EasyMock --\u003e\n                \u003cmockObjectFramework\u003e\u003c/mockObjectFramework\u003e\n                \u003c!-- testingPatternExplicitComment:ArrangeActAssert/GivenWhenThen --\u003e\n                \u003ctestingPatternExplicitComment\u003e\u003c/testingPatternExplicitComment\u003e\n                \u003cisExtensionEnabled\u003etrue\u003c/isExtensionEnabled\u003e\n                \u003cextensionConfigXML\u003ejunithelper-extension.xml\u003c/extensionConfigXML\u003e\n            \u003c/configuration\u003e\n        \u003c/plugin\u003e\n        ...\n    \u003c/plugins\u003e\n\u003c/build\u003e\n```\n\n## How to use\n\n### Goals\n\n* `junithelper:make` \n\nThis goal is used to execute adding or updating tests. It is possible to specify targets by adding \"target\" option, for example \"mvn junithelper:make -Dtarget=src/main/java/snippet/\" or \"mvn junithelper:make -Dtarget=src/main/java/snippet/Sample.java\".\n\n* `junithepler:force3` \n\nThis goal is used to execute converting tests to JUnit 3.x style. \"-Dtarget=***\" is also availale.\n\n* `junithelper:force4` \n\nThis goal is used to execute converting tests to JUnit 4.x style.  \"-Dtarget=***\" is also availale.\n\n```sh\n$ mvn junithelper:make\n[INFO] Scanning for projects...\n[INFO] ------------------------------------------------------------------------\n[INFO] Building maven-junithelper-plugin Maven Mojo\n[INFO]    task-segment: [junithelper:make]\n[INFO] ------------------------------------------------------------------------\n\n[INFO] [junithelper:make {execution: default-cli}]\n  _\n   /   _  ._/_/_/_  /_  _  _\n(_//_// // / / //_'//_//_'/\n                   /\nJUnit Helper version 1.12\n\n\n  Target: /Users/seratch/IdeaProjects/sample/src/main/java/sample/SampleBean.java\n\nAre you sure?(y/n)\n\n```\n\n# JUnit Helper Extension\n\n## What's this? \n\nYou can customize JUnit Helper's template generation.\n\n## How to use \n\n* Eclipse Plugin\n\nPut junithelper-extension.xml in the project root directory. If you also put junithelper-config.properties, it is required to change \"isExtensionEnabled\" to true.\n\n* Command Line Script\n\nChange \"isExtensionEnabled\" to true in junithelper-config.properties and edit junithelper-extension.xml.\n\n* Maven plugin\n\nAdd configuration in pom.xml and put junithelper-extension.xml in the project root directory.\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003eorg.junithelper\u003c/groupId\u003e\n    \u003cartifactId\u003emaven-junithelper-plugin\u003c/artifactId\u003e\n    \u003cconfiguration\u003e\n        \u003cisExtensionEnabled\u003etrue\u003c/isExtensionEnabled\u003e\n        \u003cextensionConfigXML\u003ejunithelper-extension.xml\u003c/extensionConfigXML\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n## junithelper-extension.xml \n\n* instantiation\n\nCustomize the default way to instantiate.\n\n* arg\n\nAdd customized parameter-range testing patterns to each type of argument.\n\n* return\n\nAdd customized assertions to each type of return value.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cjunithelper-extension\u003e\n\n  \u003c!-- \n    =============================\n     * Instantiation *\n    =============================\n    [NOTE] Mock objects or extension's Arg Patterns are given preference.\n    [NOTE] {instance} will be replaced to arg variable\n\n    ****** \u003cXML\u003e ******\n      \u003cinstantiation class=\"com.example.Worker\"\u003e\n        \u003cimport\u003ecom.example.WorkerFactory\u003c/import\u003e\n        \u003cassign\u003eWorkerFactory.getNewWorker()\u003c/assign\u003e\n      \u003c/instantiation\u003e\n      \u003cinstantiation class=\"java.util.Calendar\"\u003e\n        \u003cassign\u003eCalendar.getInstance()\u003c/assign\u003e\n        \u003cpost-assign\u003e{instance}.add(Calendar.DATE, -1);\u003c/post-assign\u003e\n      \u003c/instantiation\u003e\n\n    ****** \u003cTarget\u003e ******\n      public void putCalendar(Calendar cal) {}\n\n    ****** \u003cTest\u003e ******\n      @Test \n      public void putCalendar_A$() throws Exception {\n        // TODO auto-generated by JUnit Helper.\n        Worker target = WorkerFactory.getNewWorker();\n        Calendar cal = Calendar.getIntance();\n        cal.add(Calendar.DATE, -1);\n        target.putCalendar(cal);\n      }\n  --\u003e\n  \u003cinstantiation class=\"java.util.Calendar\"\u003e\n    \u003cassign\u003eCalendar.getInstance()\u003c/assign\u003e\n    \u003cpost-assign\u003e{instance}.add(Calendar.DATE, -1)\u003c/post-assign\u003e\n  \u003c/instantiation\u003e\n  \u003cinstantiation class=\"java.io.InputStream\"\u003e\n    \u003cimport\u003ejava.io.ByteArrayInputStream\u003c/import\u003e\n    \u003cassign\u003enew ByteArrayInputStream(new byte[] {})\u003c/assign\u003e\n  \u003c/instantiation\u003e\n\n  \u003c!-- \n    =============================\n     * Arg Patterns *\n    =============================\n    [NOTE] {arg} will be replaced to arg variable\n\n    ****** \u003cXML\u003e ******\n      \u003carg class=\"int\" \u003e\n        \u003cpattern name=\"minus1\"\u003e\u003cassign\u003e-1\u003c/assign\u003e\u003c/pattern\u003e\n        \u003cpattern name=\"random\"\u003e\n          \u003cimport\u003ejava.util.Random\u003c/import\u003e\n          \u003cpre-assign\u003eSystem.out.println(\"Before\");\u003c/pre-assign\u003e\n          \u003cassign\u003enew Random().nextInt(10)\u003c/assign\u003e\n          \u003cpost-assign\u003eSystem.out.println(\"After\");\u003c/post-assign\u003e\n        \u003c/pattern\u003e\n      \u003c/arg\u003e\n\n    ****** \u003cTarget\u003e ******\n      public void increment(int i) {}\n\n    ****** \u003cTest\u003e ******\n      @Test \n      public void increment_A$int_intIsMinus1() throws Exception {\n        // TODO auto-generated by JUnit Helper.\n        Sample target = new Sample();\n        int i = -1;\n        target.increment(i);\n      }\n      @Test \n      public void increment_A$int_intIsRandom() throws Exception {\n        // TODO auto-generated by JUnit Helper.\n        Sample target = new Sample();\n        System.out.println(\"Before\");\n        int i = new Random().nextInt(10);\n        System.out.println(\"After\");\n        target.increment(i);\n      }\n  --\u003e\n  \u003c!-- Primitive types --\u003e\n  \u003carg class=\"int\" \u003e\n    \u003cpattern name=\"minus1\"\u003e\u003cassign\u003e-1\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0\"\u003e\u003cassign\u003e0\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1\"\u003e\u003cassign\u003e1\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"2\"\u003e\u003cassign\u003e2\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"random\"\u003e\n      \u003cimport\u003ejava.util.Random\u003c/import\u003e\n      \u003cassign\u003enew Random().nextInt(10)\u003c/assign\u003e\n    \u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"long\" \u003e\n    \u003cpattern name=\"minus1L\"\u003e\u003cassign\u003e-1L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0L\"\u003e\u003cassign\u003e0L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1L\"\u003e\u003cassign\u003e1L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"2L\"\u003e\u003cassign\u003e2L\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"double\" \u003e\n    \u003cpattern name=\"minus1_0D\"\u003e\u003cassign\u003e-1.0D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0_0D\"\u003e\u003cassign\u003e0.0D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0_5D\"\u003e\u003cassign\u003e0.5D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1_0D\"\u003e\u003cassign\u003e1.0D\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"boolean\" \u003e\n    \u003cpattern name=\"true\"\u003e\u003cassign\u003etrue\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"false\"\u003e\u003cassign\u003efalse\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \n  \u003c!-- Primitive wrapper types --\u003e\n  \u003carg class=\"java.lang.Integer\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"minus1\"\u003e\u003cassign\u003e-1\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0\"\u003e\u003cassign\u003e0\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1\"\u003e\u003cassign\u003e1\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"2\"\u003e\u003cassign\u003e2\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"java.lang.Long\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"minus1L\"\u003e\u003cassign\u003e-1L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0L\"\u003e\u003cassign\u003e0L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1L\"\u003e\u003cassign\u003e1L\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"2L\"\u003e\u003cassign\u003e2L\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"java.lang.Double\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"minus1_0D\"\u003e\u003cassign\u003e-1.0D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0_0D\"\u003e\u003cassign\u003e0.0D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"0_5D\"\u003e\u003cassign\u003e0.5D\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"1_0D\"\u003e\u003cassign\u003e1.0D\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"java.lang.Boolean\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"true\"\u003e\u003cassign\u003etrue\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"false\"\u003e\u003cassign\u003efalse\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"java.lang.String\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"empty\"\u003e\u003cassign\u003e\"\"\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"2\"\u003e\u003cassign\u003e\"2\"\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n\n  \u003c!-- Date time --\u003e\n  \u003carg class=\"java.util.Date\"\u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"now\"\u003e\u003cassign\u003enew Date()\u003c/assign\u003e\u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"java.util.Calendar\" \u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"now\"\u003e\u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"Date02_29\"\u003e\n      \u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\n      \u003cpost-assign\u003e\n        {arg}.set(Calendar.YEAR, 2000);\n        {arg}.set(Calendar.MONTH, 2 - 1);\n        {arg}.set(Calendar.DATE, 29);\n        {arg}.set(Calendar.HOUR_OF_DAY, 0);\n        {arg}.set(Calendar.MINUTE, 0);\n        {arg}.set(Calendar.SECOND, 0);\n        {arg}.set(Calendar.MILLISECOND, 0);\n      \u003c/post-assign\u003e\n    \u003c/pattern\u003e\n    \u003cpattern name=\"Date12_31\"\u003e\n      \u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\n      \u003cpost-assign\u003e\n        {arg}.set(Calendar.YEAR, 1999);\n        {arg}.set(Calendar.MONTH, 12 - 1);\n        {arg}.set(Calendar.DATE, 31);\n        {arg}.set(Calendar.HOUR_OF_DAY, 0);\n        {arg}.set(Calendar.MINUTE, 0);\n        {arg}.set(Calendar.SECOND, 0);\n        {arg}.set(Calendar.MILLISECOND, 0);\n      \u003c/post-assign\u003e\n    \u003c/pattern\u003e\n    \u003cpattern name=\"Date01_01\"\u003e\n      \u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\n      \u003cpost-assign\u003e\n        {arg}.set(Calendar.YEAR, 2000);\n        {arg}.set(Calendar.MONTH, 1 - 1);\n        {arg}.set(Calendar.DATE, 1);\n        {arg}.set(Calendar.HOUR_OF_DAY, 0);\n        {arg}.set(Calendar.MINUTE, 0);\n        {arg}.set(Calendar.SECOND, 0);\n        {arg}.set(Calendar.MILLISECOND, 0);\n      \u003c/post-assign\u003e\n    \u003c/pattern\u003e\n    \u003cpattern name=\"Time23_59_59\"\u003e\n      \u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\n      \u003cpost-assign\u003e{arg}.set(Calendar.YEAR, 1995);\n        {arg}.set(Calendar.MONTH, 5 - 1);\n        {arg}.set(Calendar.DATE, 24);\n        {arg}.set(Calendar.HOUR_OF_DAY, 23);\n        {arg}.set(Calendar.MINUTE, 59);\n        {arg}.set(Calendar.SECOND, 59);\n        {arg}.set(Calendar.MILLISECOND, 0);\n      \u003c/post-assign\u003e\n    \u003c/pattern\u003e\n    \u003cpattern name=\"Time00_00_00\"\u003e\n      \u003cassign\u003eCalendar.getInstance();\u003c/assign\u003e\n      \u003cpost-assign\u003e\n        {arg}.set(Calendar.YEAR, 1995);\n        {arg}.set(Calendar.MONTH, 5 - 1);\n        {arg}.set(Calendar.DATE, 25);\n        {arg}.set(Calendar.HOUR_OF_DAY, 0);\n        {arg}.set(Calendar.MINUTE, 0);\n        {arg}.set(Calendar.SECOND, 0);\n        {arg}.set(Calendar.MILLISECOND, 0);\n      \u003c/post-assign\u003e\n    \u003c/pattern\u003e\n  \u003c/arg\u003e\n  \u003carg class=\"org.joda.time.DateTime\"\u003e\n    \u003cimport\u003eorg.joda.time.format.DateTimeFormat\u003c/import\u003e\n    \u003cpattern name=\"null\"\u003e\u003cassign\u003enull\u003c/assign\u003e\u003c/pattern\u003e\n    \u003cpattern name=\"JavaBirthday\"\u003e\n      \u003cassign\u003e\n        DateTimeFormat.forPattern(\"yyyyMMddHHmmss\").parseDateTime(\"19950525000000\")\n      \u003c/assign\u003e\n    \u003c/pattern\u003e\n  \u003c/arg\u003e\n\n  \u003c!-- \n    =============================\n     * Assertions *\n    =============================\n\n    ****** \u003cXML\u003e ******\n      \u003creturn class=\"int\"\u003e\n        \u003cimport\u003estatic org.hamcrest.Matchers.*\u003c/import\u003e\n        \u003cimport\u003estatic org.junit.Assert.*\u003c/import\u003e\n        \u003cassert\u003eassertThat(actual, is(greaterThanOrEqualTo(0)));\u003c/assert\u003e\n        \u003cassert\u003eassertThat(actual, is(lessThanOrEqualTo(Integer.MAX_VALUE)));\u003c/assert\u003e\n      \u003c/return\u003e\n\n    ****** \u003cTarget\u003e ******\n      public int increment() {\n        this.i += 1;\n        return this.i;\n      }\n\n    ****** \u003cTest\u003e ******\n      @Test \n      public void increment_A$() throws Exception {\n        // TODO auto-generated by JUnit Helper.\n        Sample target = new Sample();\n        int actual = target.increment();\n        assertThat(actual, is(greaterThanOrEqualTo(0)));\n        assertThat(actual, is(lessThanOrEqualTo(Integer.MAX_VALUE)));\n      }\n\n  --\u003e\n  \u003c!-- JUnit 3.x --\u003e\n  \u003c!-- \n  \u003creturn class=\"int\"\u003e\n    \u003cassert\u003eassertTrue(actual \u003e= 0);\u003c/assert\u003e\n  \u003c/return\u003e\n   --\u003e\n  \u003c!-- JUnit 4.x --\u003e\n  \u003creturn class=\"int\"\u003e\n    \u003cimport\u003estatic org.hamcrest.Matchers.*\u003c/import\u003e\n    \u003cimport\u003estatic org.junit.Assert.*\u003c/import\u003e\n    \u003cassert\u003eassertThat(actual, is(greaterThanOrEqualTo(0)));\u003c/assert\u003e\n    \u003cassert\u003eassertThat(actual, is(lessThanOrEqualTo(Integer.MAX_VALUE)));\u003c/assert\u003e\n  \u003c/return\u003e\n  \u003creturn class=\"java.lang.Integer\"\u003e\n    \u003cimport\u003estatic org.hamcrest.Matchers.*\u003c/import\u003e\n    \u003cimport\u003estatic org.junit.Assert.*\u003c/import\u003e\n    \u003cassert\u003eassertThat(actual, is(greaterThanOrEqualTo(0)));\u003c/assert\u003e\n    \u003cassert\u003eassertThat(actual, is(lessThanOrEqualTo(Integer.MAX_VALUE)));\u003c/assert\u003e\n  \u003c/return\u003e\n\n\u003c/junithelper-extension\u003e\n```\n\n## JUnit Helper User Group\n\nhttps://groups.google.com/group/junit-helper-group\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseratch%2Fjunithelper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseratch%2Fjunithelper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseratch%2Fjunithelper/lists"}