Blogs
In liferay 7.1 we have an article here that explain "Introduction to Testing ", first of all i suggest you read this useful document because in this post we just implement an module to testing a "Liferay Service Builder Module" Step-by-Step with famous "Foo" entity.
Lets Go!
Step 1 - Create a liferay workspace with blade CLI
First consider that you are using latest version of Blade CLI.
Create an empty directory with name liferay-ws-7.2 on your computer, got to this directory and initializing and empty workspace by executing bellow command.
blade init -v 7.2
Then open that in your favorite IDE, i use IntelliJ IDEA.
Next, check your workspace settings :
.blade.properties
it should be like below :
liferay.version.default=7.2 profile.name=gradle
gradle.properties
you should have bellow property in your file :
liferay.workspace.bundle.url=https://releases-cdn.liferay.com/portal/7.2.1-ga2/liferay-ce-portal-tomcat-7.2.1-ga2-20191111141448326.tar.gz app.server.tomcat.version=9.0.17 liferay.workspace.target.platform.version=7.2.1
-
settings.gradle
Check dependencies version here.
buildscript {
dependencies {
classpath group: "com.liferay", name: "com.liferay.gradle.plugins.workspace", version: "2.2.11"
classpath group: "net.saliman", name: "gradle-properties-plugin", version: "1.4.6"
}
repositories {
maven {
url "https://repository-cdn.liferay.com/nexus/content/groups/public"
}
}
}
apply plugin: "net.saliman.properties"
apply plugin: "com.liferay.workspace"
Now you have an suitable liferay work space to create a Service Builder Module!
Step 2 - Create Foo Service Builder Module
- Create foo module with executing bellow command :
blade create -t service-builder -p ir.sain.example -c FooPortlet foo
your foo module will be created on module directory

- Then execute bellow command to generating service layer classes:
.\gradlew buildService
The result :
> Task :modules:foo:foo-service:buildService Building Foo Writing src\main\java\ir\sain\example\service\persistence\impl\FooPersistenceImpl.java Writing ..\foo-api\src\main\java\ir\sain\example\service\persistence\FooPersistence.java Writing ..\foo-api\src\main\java\ir\sain\example\service\persistence\FooUtil.java Writing src\main\java\ir\sain\example\model\impl\FooModelImpl.java Writing src\main\java\ir\sain\example\model\impl\FooBaseImpl.java Writing src\main\java\ir\sain\example\model\impl\FooImpl.java Writing ..\foo-api\src\main\java\ir\sain\example\model\FooModel.java Writing ..\foo-api\src\main\java\ir\sain\example\model\Foo.java Writing src\main\java\ir\sain\example\model\impl\FooCacheModel.java Writing ..\foo-api\src\main\java\ir\sain\example\model\FooWrapper.java Writing ..\foo-api\src\main\java\ir\sain\example\model\FooSoap.java Writing src\main\java\ir\sain\example\service\impl\FooLocalServiceImpl.java Writing src\main\java\ir\sain\example\service\base\FooLocalServiceBaseImpl.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalService.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalServiceUtil.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalServiceWrapper.java Writing src\main\java\ir\sain\example\service\impl\FooServiceImpl.java Writing src\main\java\ir\sain\example\service\base\FooServiceBaseImpl.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooService.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooServiceUtil.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooServiceWrapper.java Writing src\main\java\ir\sain\example\service\http\FooServiceHttp.java Writing src\main\java\ir\sain\example\service\http\FooServiceSoap.java Writing src\main\resources\META-INF\module-hbm.xml Writing src\main\resources\META-INF\portlet-model-hints.xml Writing ..\foo-api\src\main\java\ir\sain\example\exception\NoSuchFooException.java Writing src\main\java\ir\sain\example\service\persistence\impl\constants\FOOPersistenceConstants.java Writing src\main\resources\META-INF\sql\indexes.sql Writing src\main\resources\META-INF\sql\tables.sql Writing src\main\resources\META-INF\sql\tables.sql Writing src\main\resources\service.properties BUILD SUCCESSFUL in 5s 1 actionable task: 1 executed
Next, create an add function in ir.sain.example.service.impl.FooLocalServiceImpl just for testing.
@Override
public Foo addFoo(
long userId, String field1, boolean field2,int field3, Date field4, String field5, ServiceContext serviceContext)
throws PortalException {
// Foo
User user = userLocalService.getUser(userId);
long groupId = serviceContext.getScopeGroupId();
long fooId = counterLocalService.increment();
Foo foo = fooPersistence.create(fooId);
foo.setUuid(serviceContext.getUuid());
foo.setGroupId(groupId);
foo.setCompanyId(user.getCompanyId());
foo.setUserId(user.getUserId());
foo.setUserName(user.getFullName());
foo.setField1(field1);
foo.setField2(field2);
foo.setField3(field3);
foo.setField4(field4);
foo.setField5(field5);
foo = fooPersistence.update(foo);
// TODO: Resources
// TODO: Asset
// TODO: Workflow
return foo;
}
.\gradlew buildService
The result :
> Task :modules:foo:foo-service:buildService Building Foo Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalService.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalServiceUtil.java Writing ..\foo-api\src\main\java\ir\sain\example\service\FooLocalServiceWrapper.java Writing src\main\resources\service.properties
Step 3 - Create Foo Test Module
- First, Create an empty module with exciting bellow command :
blade create -t api -p ir.sain.example.test foo-test
- Then move foo-test module to foo directory in modules directory.

Do some changes :
- change bnd.bnd
Bundle-Name: foo-test Bundle-SymbolicName: ir.sain.example.test Bundle-Version: 1.0.0
- remove main directory in src directory.
- replace buildService task in build.gradle in foo-service module with bellow task
buildService {
apiDir = "../foo-api/src/main/java"
testDir = "../foo-test/src/testIntegration/java"
}
.\gradlew buildService
The result :
> Task :modules:foo:foo-service:buildService Building Foo Writing ..\foo-test\src\testIntegration\java\ir\sain\example\service\persistence\test\FooPersistenceTest.java Writing src\main\resources\service.properties BUILD SUCCESSFUL in 5s 1 actionable task: 1 executed
Now, service-builder will be create FooPersistenceTest class in your foo-test module.
- Change the build.gradle file in foo-test module to :
dependencies {
testCompile group: "com.liferay", name: "com.liferay.petra.lang"
testCompile group: "com.liferay", name: "com.liferay.petra.string"
testCompile group: "com.liferay", name: "com.liferay.registry.api"
testCompile group: "com.liferay.portal", name: "com.liferay.portal.kernel"
testCompile group: "javax.portlet", name: "portlet-api"
testCompile group: "junit", name: "junit"
testCompile group: "org.apache.felix", name: "org.apache.felix.http.servlet-api", version: "1.1.2"
testCompile group: "org.osgi", name: "org.osgi.core"
testCompile group: "org.slf4j", name: "slf4j-api"
testCompile group: "org.springframework", name: "spring-test"
testIntegrationCompile group: "com.liferay", name: "com.liferay.arquillian.extension.junit.bridge", version: "1.0.19"
testIntegrationCompile group: "com.liferay.portal", name: "com.liferay.portal.test", version: "6.2.5"
testIntegrationCompile group: "com.liferay.portal", name: "com.liferay.portal.test.integration", version: "6.0.24"
testIntegrationCompile group: "log4j", name: "log4j", version: "1.2.17"
testIntegrationCompile project(":modules:foo:foo-api")
testIntegrationCompile project(":modules:foo:foo-service")
testModules group: "com.liferay", name: "com.liferay.arquillian.extension.junit.bridge.connector", version: "1.0.0"
testModules group: "com.liferay", name: "com.liferay.sync.api", version: "5.0.6"
testModules group: "com.liferay", name: "com.liferay.sync.service", version: "3.0.9"
testModules group: "com.liferay.portal", name: "com.liferay.portal.test", version: "6.2.5"
testModules group: "com.liferay.portal", name: "com.liferay.portal.test.integration", version: "6.0.24"
testModules group: "org.apache.aries.jmx", name: "org.apache.aries.jmx.core", version: "1.1.7"
}
copyTestModules {
dependsOn ":modules:foo:foo-api:deploy", ":modules:foo:foo-service:deploy"
}
setUpTestableTomcat {
dependsOn ":initBundle"
}
-
Create FooLocalServiceTest class in
ir.sain.example.service.testlike bellow :
package ir.sain.example.service.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.service.test.ServiceTestUtil;
import com.liferay.portal.test.rule.Inject;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import ir.sain.example.model.Foo;
import ir.sain.example.service.FooLocalService;
import org.junit.*;
import org.junit.runner.RunWith;
/**
* @author Nader Jafari
*/
@RunWith(Arquillian.class)
public class FooLocalServiceTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new LiferayIntegrationTestRule();
@Before
public void setUp() throws Exception {
_group = GroupTestUtil.addGroup();
_user = TestPropsValues.getUser();
ServiceTestUtil.setUser(TestPropsValues.getUser());
}
@Test
public void testAddFoo() throws Exception {
int initialCount = _fooLocalService.getFoosCount();
addFoo(_user.getUserId());
int actualCount = _fooLocalService.getFoosCount();
Assert.assertEquals(initialCount + 1, actualCount);
}
protected Foo addFoo(long userId)
throws Exception {
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(
_group.getGroupId(), userId);
return _fooLocalService.addFoo(
userId, RandomTestUtil.randomString(),RandomTestUtil.randomBoolean(),
RandomTestUtil.randomInt(), RandomTestUtil.nextDate(),RandomTestUtil.randomString(),
serviceContext);
}
@DeleteAfterTestRun
private Group _group;
@Inject
private FooLocalService _fooLocalService;
private User _user;
}
Step 4 - Running Integration Test!
Now we are in exciting step!
excute bellow command in Work Space root directory,
This will (download and) start a Liferay instance, deploy the required modules and run the tests found in the test module.
F:\liferay\liferay-ws-7.2> .\gradlew testIntegration
if everything's go fine , you should see generated report in liferay-ws-7.2\modules\foo\foo-test\build\reports\tests\testIntegration


You could clone entire project from Here !
Special thank to Christian Berndt who helped me to write this post.

